标签: lxml

以 UTF-8 格式从 lxml 错误日志中打印消息

我学习python(2.7版本),我有任务使用lxml库(http://lxml.de/)通过xsd模式检查xml文档。我有两个文件 - 像这样的例子:

$ cat 1.xml 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE yml_catalog SYSTEM "shops.dtd">
<a>
  <b>?????? ???!</b>
</a>
Run Code Online (Sandbox Code Playgroud)

$cat 2.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="a" type="AType"/>
  <xs:complexType name="AType">
    <xs:sequence>
      <xs:element name="b" type="xs:decimal" />
   </xs:sequence>
  </xs:complexType>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)

它应该非常简单,但我不明白如何将 lxml 与 utf-8 一起使用(从不使用硬编码)。我做简单的步骤:

>>> from lxml import etree
>>> schema = etree.parse("/tmp/qwerty/2.xsd")
>>> xmlschema = etree.XMLSchema(schema)
>>> try:
    document = etree.parse("/tmp/qwerty/1.xml")
    print "Parse complete!"
except etree.XMLSyntaxError, e:
    print e

Parse complete!
>>> xmlschema.validate(document)
False
>>> xmlschema.error_log

Traceback …
Run Code Online (Sandbox Code Playgroud)

python xml parsing xsd lxml

2
推荐指数
1
解决办法
2167
查看次数

lxml 以 xpath 开头

我将如何获得以下内容(使用%for a LIKE 语句)-

assets['HasEN'] = self.node.xpath('//data_file[@role="source"]/locale[@name="en%"]')
Run Code Online (Sandbox Code Playgroud)

换句话说,名字可以是en,它可以是en-US,它可以是en-GB,等等。

lxml在解析 XML 之后,有没有办法做到这一点,或者我必须这样做?

python lxml

2
推荐指数
1
解决办法
3289
查看次数

Best way in lxml to test if an element is the root

I am new to python and xml parsing, so this may be a very dumb question. What is the best way to test if a given element if it is the root if the root is not known? So for example, given a generic test.xml structure;

<root>
<child1>
<child2>
<child3>Some Text</child3>
Run Code Online (Sandbox Code Playgroud)

And you have a function that takes in elements only. The only way I have come up so far is something like this, but requires the root to be …

python xml lxml

2
推荐指数
1
解决办法
826
查看次数

lxml/requests 可以选择下拉选项然后解析生成的ajax吗?

我有一个我正在尝试测试的网站,虽然我可以在下拉列表中获得选项列表,但我不确定如何选择它?没有提交按钮,所以如果我选择它,那么它会在下面加载一个 ajax 表。

我只是不确定 lxml/requests 是否可以做到这一点或如何做到这一点?如果有人可以确认或知道可以做到这一点的功能,我将不胜感激?

编辑:我的网站是内部的,无法访问,但这里是一个示例网站:https : //www.tsx.com/listings/listing-with-us/listed-company-directory 请注意,如果您选择搜索旁边的框,它将拉输出 ajax 结果(A、B、C 等)

python lxml web-scraping python-requests

2
推荐指数
1
解决办法
508
查看次数

在 Python 中使用 XPath 和 LXML

我有一个 python 脚本,用于解析 XML 并将某些感兴趣的元素导出到 csv 文件中。我现在尝试更改脚本以允许根据条件过滤 XML 文件,等效的 XPath 查询将是:

\DC\Events\Confirmation[contains(TransactionId,"GTEREVIEW")]
Run Code Online (Sandbox Code Playgroud)

当我尝试使用 lxml 这样做时,我的代码是:

xml_file = lxml.etree.parse(xml_file_path)
namespace = "{" + xml_file.getroot().nsmap[None] + "}"
node_list = xml_file.findall(namespace + "Events/" + namespace + "Confirmation[TransactionId='*GTEREVIEW*']")
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用。任何人都可以帮忙吗?XML 文件示例:

<Events>
  <Confirmation>
    <TransactionId>GTEREVIEW2012</TransactionId>
  </Confirmation>    
  <Confirmation>
    <TransactionId>GTEDEF2012</TransactionId>
  </Confirmation>    
</Events> 
Run Code Online (Sandbox Code Playgroud)

所以我想要所有包含交易 ID 的“确认”节点,其中包含字符串“GTEREVIEW”。谢谢

python xml xpath lxml contains

2
推荐指数
1
解决办法
1万
查看次数

python,lxml检索列表中的所有元素

我正在尝试从网站获取列表中的所有元素

来自以下 html 片段:

<ul>
    <li class="name"> James </li>
    <li> Male </li>
    <li> 5'8" </li>
</ul>
Run Code Online (Sandbox Code Playgroud)

我当前的代码使用 xpath 并将名称存储在列表中。有没有办法将所有三个字段作为列表?

我的代码:

name = tree.xpath('//li[@class="name"]/text()')
Run Code Online (Sandbox Code Playgroud)

html python lxml web-scraping

2
推荐指数
1
解决办法
1873
查看次数

Python lxml:忽略 XML 声明(错误)

我正在尝试~/.config/Thunar/uca.xml使用lxmlPython 模块解析文件浏览器 Thunar 的自定义操作文件 ( ) 。

出于某种原因,Thunar 显然将 amalformed declaration写入这些文件:

<?xml encoding="UTF-8" version="1.0"?>
Run Code Online (Sandbox Code Playgroud)

显然,version预期将作为声明中的第一个“属性”出现。如果我尝试解析文件lxmlXMLSyntaxError则会引发一个。

不,我不能简单地更正声明,因为 Thunar 一直用虚假的声明覆盖它。

这很可能是 Thunar 中的一个错误。

不过,我想知道如何忽略带有lxml.

我知道我可以预处理 XML 文档以过滤掉 XML 声明。但这似乎不是很优雅。由于 XML 似乎默认为 1.0 版和 UTF-8 编码,因此肯定有可能忽略声明并假设lxml. 我在文档或谷歌上没有找到任何东西,我可能忽略了一些东西。

python xml lxml thunar

2
推荐指数
1
解决办法
2495
查看次数

SSL:CERTIFICATE_VERIFY_FAILED 证书验证失败

from lxml import html
import requests


url = "https://website.com/"
page = requests.get(url)
tree = html.fromstring(page.content)
page.content
Run Code Online (Sandbox Code Playgroud)

-> SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败 (_ssl.c:748)

我运行此脚本,但出现此错误。我该怎么做?

python ssl lxml xmlhttprequest python-3.x

2
推荐指数
1
解决办法
2万
查看次数

使用 BS4 "lxml" 抓取 XML 数据

试图解决与此非常相似的问题:

[用beautifulsoup抓取XML元素属性

我有以下代码:

from bs4 import BeautifulSoup
import requests
r = requests.get('https://www.usda.gov/oce/commodity/wasde/latest.xml')
data = r.text
soup = BeautifulSoup(data, "lxml")
for ce in soup.find_all("Cell"):
    print(ce["cell_value1"])
Run Code Online (Sandbox Code Playgroud)

代码运行没有错误,但不会向终端打印任何值。

我想为整个页面提取上面提到的“cell_value1”数据,所以我有这样的东西:

2468.58
3061.58
376.64
and so on...
Run Code Online (Sandbox Code Playgroud)

我的 XML 文件的格式与上述问题的解决方案中的示例相同。我确定了特定于我想要抓取的属性的适当属性标签。为什么这些值没有打印到终端?

python lxml beautifulsoup elementtree python-3.x

2
推荐指数
1
解决办法
1671
查看次数

Python:LXML - 如何将元素添加到现有元素树

我需要通过向现有元素添加子元素来修改现有 xml 文件。我使用 lxml 库。

<addressbook>
<person>
    <name>Eric Idle</name>
    <phone type='fix'>999-999-999</phone>
    <phone type='mobile'>555-555-555</phone>
    <address>
        <street>12, spam road</street>
        <city>London</city>
        <zip>H4B 1X3</zip>
    </address>
</person>
</addressbook>
Run Code Online (Sandbox Code Playgroud)

这是 XML;让我们假设我想添加第二个名字:

<addressbook>
<person>
    <name>Eric Idle</name>
    <name>TEST TEST</name>
    <phone type='fix'>999-999-999</phone>
    <phone type='mobile'>555-555-555</phone>
    <address>
        <street>12, spam road</street>
        <city>London</city>
        <zip>H4B 1X3</zip>
    </address>
</person>
</addressbook>
Run Code Online (Sandbox Code Playgroud)

我知道我可以解析文件并使用 etree.getroot() 获取根,但是我可以将 /adressbook/person 作为 etree.element 获取吗?

python xml lxml elementtree

2
推荐指数
1
解决办法
2190
查看次数