lxml是一个功能齐全的高性能Python库,用于处理XML和HTML。
在Python中解析Google Earth KML文件(lxml,命名空间)
我正在尝试使用 xml 模块将 .kml 文件解析为 Python(在我用于 HTML 的 BeautifulSoup 中未能完成此操作之后)。 因为这是我第一次这样做,所以我就跟着走了......
我正在使用 Python lxml.html 包来抓取 HTML 文件。 我试图抓取的 HTML 部分读取 DAB Ensemble 1 的描述我不关心的东西 我正在使用 Python lxml.html 包来抓取 HTML 文件。 我试图抓取的 HTML 部分读取 <h1>Description of DAB Ensemble 1</h1><table>Stuff I don't care about</table> <!-- Tags I don't care about --> <div id="announcement_data_block"> <h3>Announcement information</h3> <p>No announcement information is broadcast</p> </div> <!-- More tags I don't care about --> <h1>Description of DAB Ensemble 2</h1><table>Stuff I don't care about</table> <!-- Tags I don't care about --> <div id="announcement_data_block"> <h3>Announcement information</h3> <h4>Announcement switching (FIG0/19)</h4> <table>Stuff I DO care about</table> </div> <!-- More tags I don't are about --> 我对“公告切换”表感兴趣,对于给定的 DAB 整体,该表可能存在也可能不存在。我有一个lxml.hmtl.xpath表达式如下: f'//h1[text()="Description of DAB Ensemble {ens_idx}"]/following-sibling::table/following-sibling::div[@id="announcement_data_block"]/h4[starts-with(text(), "Announcement switching")]/following-sibling::table' 根据我的理解,这个 XPath 语句是说,对于给定的 ens_idx 值: 从根目录开始,找到文本匹配“Description of DAB Ensemble {ens_idx}”的 h1 标签(例如“Description of DAB Ensemble 1”、“Description of DAB Ensemble 2”),然后转到您看到的第一个表。 在上面的示例中,它将是标记为“我不关心的东西”的表。 然后,转到下一个 id 为“announcement_data_block”的 div。 在该 div 中,找到一个 h4 标签,其文本以“公告切换”开头。 获取接下来的第一个表。 在上面的示例中,DAB Ensemble 1 没有这样的表。 我希望 xpath 在尝试获取 DAB Ensemble 1 的表时返回 None 。但是,xpath 在遇到 h1 标签“DAB Ensemble 2 的描述”时不知道停止,因此它会继续运行,直到找到 DAB Ensemble 2的h4标签。 我正在寻求帮助,以找到一个 xpath 语句,该语句将使 XPath 无条件停止在下一个“DAB Ensemble 的描述”h1 标记处。本质上我希望将该指令修改为: 从根目录开始,找到文本匹配“Description of DAB Ensemble {ens_idx}”的 h1 标签(例如“Description of DAB Ensemble 1”、“Description of DAB Ensemble 2”),然后转到您看到的第一个表。 在上面的示例中,它将是标记为“我不关心的东西”的表。 然后,转到下一个 id 为“announcement_data_block”的 div。 在该 div 中,找到一个 h4 标签,其文本以“公告切换”开头。 获取随后的第一个表。 如果在文本匹配“Description of DAB Ensemble {ens_idx + 1}”或 EOF 的 h1 标记之前找不到此条件,则返回 None。 粗体部分是我的 XPath 表达式中缺少的部分。有谁知道如何构造这样的表达式? 从示例中可以看出,H1 和带有 id 的 div 都是兄弟姐妹,所以 搜索应表明找到的第一个 following::table 和第一个 @id="announcement_data_block" 是必需的,因为 f'//h1[text()="Description of DAB Ensemble {ens_idx}"]/following-sibling::table[1]/following-sibling::div[@id="announcement_data_block"][1]/h4[starts-with(text(), "Announcement switching")]/following-sibling::table' 顺便说一句:id 不应重复。
我正在使用 Python lxml.html 包来抓取 HTML 文件。 我正在尝试抓取部分内容的 HTML DAB Ensemble 1 的描述我不关心的东西&... 我正在使用 Python lxml.html 包来抓取 HTML 文件。 我正在尝试抓取部分内容的 HTML <h1>Description of DAB Ensemble 1</h1><table>Stuff I don't care about</table> <!-- Tags I don't care about --> <div id="announcement_data_block"> <h3>Announcement information</h3> <p>No announcement information is broadcast</p> </div> <!-- More tags I don't care about --> <h1>Description of DAB Ensemble 2</h1><table>Stuff I don't care about</table> <!-- Tags I don't care about --> <div id="announcement_data_block"> <h3>Announcement information</h3> <h4>Announcement switching (FIG0/19)</h4> <table>Stuff I DO care about</table> </div> <!-- More tags I don't are about --> 我对“公告切换”表感兴趣,对于给定的 DAB 整体,该表可能存在也可能不存在。我有一个lxml.hmtl.xpath表达式如下: f'//h1[text()="Description of DAB Ensemble {ens_idx}"]/following-sibling::table/following-sibling::div[@id="announcement_data_block"]/h4[starts-with(text(), "Announcement switching")]/following-sibling::table' 根据我的理解,这个 XPath 语句是说,对于给定的 ens_idx 值: 从根目录开始,找到文本匹配“Description of DAB Ensemble {ens_idx}”的 h1 标签(例如“Description of DAB Ensemble 1”、“Description of DAB Ensemble 2”),然后转到您看到的第一个表。 在上面的示例中,它将是标记为“我不关心的东西”的表。 然后,转到下一个 id 为“announcement_data_block”的 div。 在该 div 中,找到一个 h4 标签,其文本以“公告切换”开头。 获取接下来的第一个表。 在上面的示例中,DAB Ensemble 1 没有这样的表。 我希望 xpath 在尝试获取 DAB Ensemble 1 的表时返回 None 。但是,xpath 在遇到 h1 标签“DAB Ensemble 2 的描述”时不知道停止,因此它会继续运行,直到找到 DAB Ensemble 2的h4标签。 我正在寻求帮助,以找到一个 xpath 语句,该语句将使 XPath 无条件停止在下一个“DAB Ensemble 的描述”h1 标记处。本质上我希望将该指令修改为: 从根目录开始,找到文本匹配“Description of DAB Ensemble {ens_idx}”的 h1 标签(例如“Description of DAB Ensemble 1”、“Description of DAB Ensemble 2”),然后转到您看到的第一个表。 在上面的示例中,它将是标记为“我不关心的东西”的表。 然后,转到下一个 id 为“announcement_data_block”的 div。 在该 div 中,找到一个 h4 标签,其文本以“公告切换”开头。 获取随后的第一个表。 如果在文本匹配“Description of DAB Ensemble {ens_idx + 1}”或 EOF 的 h1 标记之前找不到此条件,则返回 None。 粗体部分是我的 XPath 表达式中缺少的部分。有谁知道如何构造这样的表达式? 从示例中可以看出,H1 和带有 id 的 div 都是兄弟姐妹,所以 搜索应表明找到的第一个 following::table 和第一个 @id="announcement_data_block" 是必需的,因为 f'//h1[text()="Description of DAB Ensemble {ens_idx}"]/following-sibling::table[1]/following-sibling::div[@id="announcement_data_block"][1]/h4[starts-with(text(), "Announcement switching")]/following-sibling::table' 顺便说一句:id 不应重复。
我有一个结构很糟糕的 html 模板,其中我的 元素包含多个元素(p、figure、a 等),但中间也包含原始文本。我怎样才能访问所有这些文本片段,... 我有一个结构很糟糕的 html 模板,其中我的 <section> 元素包含多个元素(p、figure、a 等),但中间也包含原始文本。我如何访问所有这些文本片段,并就地编辑它们(我需要的是用标签替换所有$$code$$?) section.text 和 section.tail 都返回空字符串... 检查紧邻文本之前的完整标记的 .tail。因此,在 <section>A<p>B</p>C<p>D</p>E</section> 中,两个 .tail 元素的 <p> 将包含 C 和 E。 示例: from lxml import etree root = etree.fromstring('<root><section>A<p>B</p>C<p>D</p>E</section></root>') for section_child in root.find('section'): section_child.tail = section_child.tail.lower() print(etree.tounicode(root)) 结果: <root><section>A<p>B</p>c<p>D</p>e</section></root> 我从我发布的问题的答案中了解到:在根元素内的元素之间解析 XML 文本 from lxml import etree xml = '<a>aaaa1<b>bbbb</b>aaaa2<c>cccc</c>aaaa3</a>' element = etree.fromstring(xml) for text in element.xpath('text()'): xml = xml.replace(f'>{text}<', f'>{text.upper()}<') 对此的一个担忧是关于 xml 中的 CDATA,但我猜这对于 html 来说不是问题。
是否可以以某种方式创建具有默认文本值的元素?那么我不需要这样做吗? 从 lxml 导入 etree root = etree.Element('root') a = etree.SubElement(root, 'a') a.tex...
使用 Xcode 在 Mac OSX 上使用 pip 安装 lxml 时出现 GCC 错误
我是一个初学者,试图将 lxml 安装到我的 Mac 上的 Python 2.7.3 安装中。 我设法将其安装到 Apple 发行版中,但 pip install lxml 到该版本返回错误: 错误...
我有一个 python 函数,它接受部分 xml 字符串和根元素标签,并尝试构造一个有效的 xml。我很难让它发挥作用。 从 lxml 导入 etree 来自 lxml.builder
我想使用 lxml 从 html 页面中找出所有 url 及其名称。 我可以解析 url 并找到这个东西,但是有什么简单的方法可以使用 lxml 找到所有 url 链接吗?
我想在Python中用Xpath解析以下内容。 省份 我想在Python中使用Xpath解析以下内容。 <h3>Province</h3> <ul> <li><a href="?k=*&program_language=ENGLISH&province_code=ON">Ontario (5853)</a> <li><a href="?k=*&program_language=ENGLISH&province_code=BC">British Columbia (2096)</a> <li><a href="?k=*&program_language=ENGLISH&province_code=AB">Alberta (1241)</a> <li><a href="?k=*&program_language=ENGLISH&province_code=QC">Québec (921)</a> <li><a href="?k=*&program_language=ENGLISH&province_code=NS">Nova Scotia (895)</a> <li><a href="?k=*&program_language=ENGLISH&province_code=SK">Saskatchewan (847)</a> <li><a href="?k=*&program_language=ENGLISH&province_code=MB">Manitoba (615)</a> <li><a href="?k=*&program_language=ENGLISH&province_code=NB">New Brunswick (347)</a> <li><a href="?k=*&program_language=ENGLISH&province_code=NL">Newfoundland & Labrador (305)</a> <li><a href="?k=*&program_language=ENGLISH&province_code=PE">Prince Edward Island (120)</a> </ul> 我的Python代码如下: url=r'https://universitystudy.ca/search-programs/?k=&program_level_merged=&program_language=ENGLISH' resq=req.get(url) content=html.fromstring(resq.content) category==content.xpath('//h3[text()="Area of Study"]/following-sibling::ul/li/a/text()') 虽然我希望获得如下所示的程序名称列表,但我的代码返回一个空列表, 无法弄清楚代码出了什么问题。 Business administration and management, general (520) Computer science (289) Mathematics, general (279) Psychology, general (277) Economics, general (250) Biology/biological sciences, general (249) Geography (241) English language and literature, general (240) Chemistry, general (220) Political science and government, general (211) History, general (200) 我发现问题是由于以下原因造成的 resq=req.get(url) 实际上,服务器拒绝了 req.get 请求并且对 resq 不返回任何内容 HTTP 403 Forbidden 客户端错误响应状态码表示服务器理解请求但拒绝处理它。
如果我使用 lxml 解析 XML 文档,是否可以查看元素的文本表示形式? 我尝试这样做: 打印repr(节点) 但这输出 什么可以...
lxml 如何在使用 openpyxl 时加快保存大型 excel 文件的速度?
我在使用 openpyxl 时保存大型 Excel 文件时遇到一些问题。 Openpyxl 文档说 当您想要转储大量数据时,请确保安装了 lxml。 但没有...
使用 lxml.html 抓取嵌入元素,或者如何欺骗网站认为您已安装 Flash
我正在尝试抓取一个网站,并且需要获取嵌入元素,但由于我使用的是 Python 和 lxml.html,该网站准确地得出我没有安装 Flash 的结论,而不是
我正在使用 lxml 解析 HTML 页面。这些页面具有如下元标记: 我怎样才能...
我是新来的,总体来说对网络开发还很陌生。 我的背景是 3D 建模和设计,但我最近启动了一个项目,我认为该项目可能是 3D 社区的一个很好的资源。 ...
过去几个小时我一直在尝试编写一个程序来完成我认为非常简单的任务: 程序要求用户输入(假设类型为“幸福”) 程序问题...
将“字符串”参数传递给 xslt 2.0 脚本不起作用,但整数可以
有一个问题,尝试将字符串参数传递给 xslt 2.0 脚本,纯整数参数在本例中工作正常,但像“value”甚至“w1234”这样的字符串将会失败...
您好,我正在尝试使用 types-lxml 库输入提示 lxml 返回类型。 def parse_xml(path: str) -> etree._ElementTree: 返回 etree.parse(路径) def 组件(路径:str)-> 列表...
如何告诉lxml.etree.tostring(element)不要在python中写命名空间?
我有一个巨大的 xml 文件(1 Gig)。我想将一些元素(条目)移动到具有相同标题和规范的另一个文件。 假设原始文件包含带有标签 的条目 我有一个巨大的 xml 文件(1 Gig)。我想将一些元素(条目)移动到具有相同标题和规范的另一个文件。 假设原始文件包含带有标签 <to_move>: 的条目 <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE some SYSTEM "some.dtd"> <some> ... <to_move date="somedate"> <child>some text</child> ... ... </to_move> ... </some> 我使用 lxml.etree.iterparse 来迭代该文件。工作正常。当我找到带有标签 <to_move> 的元素时,我们假设它存储在变量 element 中,我这样做 new_file.write(etree.tostring(element)) 但这会导致 <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE some SYSTEM "some.dtd"> <some> ... <to_move xmlns:="some" date="somedate"> # <---- Here is the problem. I don't want the namespace. <child>some text</child> ... ... </to_move> ... </some> 所以问题是:如何告诉 etree.tostring() 不要写 xmlns:="some"。这可能吗?我在 lxml.etree 的 api 文档中苦苦挣扎,但找不到满意的答案。 这是我找到的etree.trostring: tostring(element_or_tree, encoding=None, method="xml", xml_declaration=None, pretty_print=False, with_tail=True, standalone=None, doctype=None, exclusive=False, with_comments=True) 将元素序列化为其 XML 的编码字符串表示形式 树。 对我来说tostring()的每一个参数似乎都没有帮助。有什么建议或者更正吗? 我经常抓住一个命名空间来为它创建一个别名,如下所示: someXML = lxml.etree.XML(someString) if ns is None: ns = {"m": someXML.tag.split("}")[0][1:]} someid = someXML.xpath('.//m:ImportantThing//m:ID', namespaces=ns) 您可以执行类似的操作来获取名称空间,以便创建一个正则表达式,该正则表达式将在使用 tostring 后清理它。 或者您可以清理输入字符串。找到第一个空格,检查其后面是否有xmlns,如果有,则删除整个xmlns位直到下一个空格,如果没有则删除该空格。重复此操作,直到不再有空格或 xmlns 声明。但不要超过第一个>。 这更多是对“unutbu”答案的评论,其中需要清理命名空间的建议,但没有给出示例。这可能就是您正在寻找的... from lxml import objectify objectify.deannotate(root, cleanup_namespaces=True) 有一种方法可以使用 XSLT 删除名称空间: import io import lxml.etree as ET def remove_namespaces(doc): # http://wiki.tei-c.org/index.php/Remove-Namespaces.xsl xslt='''<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="no"/> <xsl:template match="/|comment()|processing-instruction()"> <xsl:copy> <xsl:apply-templates/> </xsl:copy> </xsl:template> <xsl:template match="*"> <xsl:element name="{local-name()}"> <xsl:apply-templates select="@*|node()"/> </xsl:element> </xsl:template> <xsl:template match="@*"> <xsl:attribute name="{local-name()}"> <xsl:value-of select="."/> </xsl:attribute> </xsl:template> </xsl:stylesheet> ''' xslt_doc = ET.parse(io.BytesIO(xslt)) transform = ET.XSLT(xslt_doc) doc = transform(doc) return doc doc = ET.parse('data.xml') doc = remove_namespaces(doc) print(ET.tostring(doc)) 产量 <some> <to_move date="somedate"> <child>some text</child> </to_move> </some> 这是一个古老的问题,但由于 13 年后 lxml 仍然没有内置这个明显的函数,处理它的最简单方法是使用正则表达式: def get_text(element: etree.Element) -> str: s = etree.tostring(element).decode() if m := re.match(r'^<(\w*)[^>]*>((.|\n)+)<\/\1>', s): return m.group(2).strip() return s 这会剥离整个包含元素 <description blah blah blah><div>What we want</div><p>more stuff</p></description> 并仅返回 <description> 内的标记。为了安全起见,它会保存开始元素标记以在末尾进行匹配(使用 \1 反向引用),但寻找结束 <\ 效果很好,因为贪婪匹配会跳过内容中嵌入的所有其他元素。 如果匹配失败,引发 ValueError 可能会更好,但这只会返回原始的丑陋字符串、命名空间和所有内容。
给定 etree 中的元素,我想仅打印开始标签。这对于调试非常有用。 例如: >>> 从 lxml 导入 etree >>> elem = etree。
当我使用 xpath 使用 lxml 抓取数据时,我不断遇到问题。我想抓取道琼斯指数价格,但是当我用 python 打印出来时,它显示元素跨度为 0x448d6c0。我知道那一定是一个