我学习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) 我将如何获得以下内容(使用%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 之后,有没有办法做到这一点,或者我必须这样做?
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 …
我有一个我正在尝试测试的网站,虽然我可以在下拉列表中获得选项列表,但我不确定如何选择它?没有提交按钮,所以如果我选择它,那么它会在下面加载一个 ajax 表。
我只是不确定 lxml/requests 是否可以做到这一点或如何做到这一点?如果有人可以确认或知道可以做到这一点的功能,我将不胜感激?
编辑:我的网站是内部的,无法访问,但这里是一个示例网站:https : //www.tsx.com/listings/listing-with-us/listed-company-directory 请注意,如果您选择搜索旁边的框,它将拉输出 ajax 结果(A、B、C 等)
我有一个 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”。谢谢
我正在尝试从网站获取列表中的所有元素
来自以下 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) 我正在尝试~/.config/Thunar/uca.xml使用lxmlPython 模块解析文件浏览器 Thunar 的自定义操作文件 ( ) 。
出于某种原因,Thunar 显然将 amalformed declaration写入这些文件:
<?xml encoding="UTF-8" version="1.0"?>
Run Code Online (Sandbox Code Playgroud)
显然,version预期将作为声明中的第一个“属性”出现。如果我尝试解析文件lxml,XMLSyntaxError则会引发一个。
不,我不能简单地更正声明,因为 Thunar 一直用虚假的声明覆盖它。
这很可能是 Thunar 中的一个错误。
不过,我想知道如何忽略带有lxml.
我知道我可以预处理 XML 文档以过滤掉 XML 声明。但这似乎不是很优雅。由于 XML 似乎默认为 1.0 版和 UTF-8 编码,因此肯定有可能忽略声明并假设lxml. 我在文档或谷歌上没有找到任何东西,我可能忽略了一些东西。
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)
我运行此脚本,但出现此错误。我该怎么做?
试图解决与此非常相似的问题:
我有以下代码:
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 文件的格式与上述问题的解决方案中的示例相同。我确定了特定于我想要抓取的属性的适当属性标签。为什么这些值没有打印到终端?
我需要通过向现有元素添加子元素来修改现有 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 获取吗?
lxml ×10
python ×10
xml ×5
elementtree ×2
python-3.x ×2
web-scraping ×2
contains ×1
html ×1
parsing ×1
ssl ×1
thunar ×1
xpath ×1
xsd ×1