gpt4 book ai didi

python - etree 和 xpath 返回整个 html 而不是文本

转载 作者:太空宇宙 更新时间:2023-11-03 16:16:03 26 4
gpt4 key购买 nike

我已经为此工作了很长一段时间,并尝试了各种 namespace 解决方案。但是,我当前的脚本不是打印所需的字符串,而是打印整个 html 转储。有谁知道如何解决这个问题?

from lxml.html import parse
from lxml import etree
import requests

r = requests.get('https://berlin.kauperts.de/Strassen/Aachener-Strasse-10713-Berlin.html')
tree = etree.parse(r.text)
NSMAP = {'mw':'http://www.w3.org/1999/xhtml/'}
Name2 = tree.xpath('//{http://www.w3.org/1999/xhtml}html/body/div[7]/div/div/div/table/tbody/tr/td[2]/a')
Name3 = tree.find("//html/body/div[7]/div/div/div/table/tbody/tr/td[2]/a")
print(Name2, Name3)

最佳答案

命名空间是继承的。如果文档是XHTML,则默认情况下文档中的所有节点都位于XHTML命名空间中。

这意味着您必须在 XPath 表达式的每个步骤中使用该 namespace 。在第一步 (html) 中使用它是不够的。

nsmap 可以帮助您保持代码的可管理性,但您也必须使用它。

from lxml.html import parse
import requests
from lxml import etree

r = requests.get('https://berlin.kauperts.de/Strassen/Aachener-Strasse-10713-Berlin.html')
tree = etree.parse(r.text)
nsmap = {'x':'http://www.w3.org/1999/xhtml/'}

path = '//x:body/x:div[7]/x:div/x:div/x:div/x:table/x:tbody/x:tr/x:td[2]/x:a'
name = tree.findall(path, nsmap)

以上内容既笨重又脆弱。尝试创建一个更简单的表达式。

规则:切勿使用自动生成的 XPath。手动创建仍然完全匹配您需要的“最不具体”的表达式(即最少依赖于不相关的文档结构,例如 div 嵌套级别或位置)。也许沿着这个思路。

name = tree.findall('//x:table[@class="foo"]//x:td[2]/x:a', nsmap)

关于python - etree 和 xpath 返回整个 html 而不是文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38936185/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com