gpt4 book ai didi

python - 为什么这个 xpath 在 python 中使用 lxml 失败?

转载 作者:数据小太阳 更新时间:2023-10-29 01:48:50 26 4
gpt4 key购买 nike

这是我试图从中获取数据的示例网页。 http://www.makospearguns.com/product-p/mcffgb.htm

xpath 取自 chrome 开发工具,firefox 中的 firepath 也能找到它,但使用 lxml 它只会返回一个空列表 'text'。

from lxml import html
import requests

site_url = 'http://www.makospearguns.com/product-p/mcffgb.htm'
xpath = '//*[@id="v65-product-parent"]/tbody/tr[2]/td[2]/table[1]/tbody/tr/td/table/tbody/tr[2]/td[2]/table/tbody/tr[1]/td[1]/div/table/tbody/tr/td/font/div/b/span/text()'

page = requests.get(site_url)
tree = html.fromstring(page.text)
text = tree.xpath(xpath)

打印树文本
print(tree.text_content().encode('utf-8'))

显示数据在那里,但 xpath 似乎无法找到它。有什么我想念的吗?我尝试过的大多数其他网站都可以使用 lxml 和从 chrome 开发工具获取的 xpath 正常工作,但我发现有几个网站给出了空列表。

最佳答案

1。浏览器经常更改 HTML

浏览器经常更改提供给它的 HTML 以使其“有效”。例如,如果您为浏览器提供这个无效的 HTML:

<table>
<p>bad paragraph</p>
<tr><td>Note that cells and rows can be unclosed (and valid) in HTML
</table>

为了呈现它,浏览器会提供帮助并尝试使其成为有效的 HTML 并可能将其转换为:

<p>bad paragraph</p>
<table>
<tbody>
<tr>
<td>Note that cells and rows can be unclosed (and valid) in HTML</td>
</tr>
</tbody>
</table>

因为 <p> 而改变了上面的内容段落不能在<table>里面s 和 <tbody>推荐。对源应用的更改可能因浏览器而异。有些会将无效元素放在表格前,有些放在表格后,有些放在单元格内,等等...

2。 Xpath 不是固定的,它们可以灵活地指向元素。

使用这个“固定的”HTML:

<p>bad paragraph</p>
<table>
<tbody>
<tr>
<td>Note that cells and rows can be unclosed (and valid) in HTML</td>
</tr>
</tbody>
</table>

如果我们尝试定位 <td> 的文本单元格,以下所有内容都会为您提供大致正确的信息:

//td
//tr/td
//tbody/tr/td
/table/tbody/tr/td
/table//*/text()

list 还在继续......

但是,通常浏览器会为您提供最精确(也是最不灵活)的 XPath,它列出了 DOM 中的每个元素。在这种情况下:

/table[0]/tbody[0]/tr[0]/td[0]/text()

3。结论:给定 Xpath 的浏览器通常没有帮助

这就是为什么当您尝试使用原始 HTML 时,开发人员工具生成的 XPath 经常会为您提供错误的 Xpath。

解决方案,始终引用原始 HTML 并使用灵活但精确的 XPath。

检查包含价格的实际 HTML:

<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td>
<font class="pricecolor colors_productprice">
<div class="product_productprice">
<b>
<font class="text colors_text">Price:</font>
<span itemprop="price">$149.95</span>
</b>
</div>
</font>
<br/>
<input type="image" src="/v/vspfiles/templates/MAKO/images/buttons/btn_updateprice.gif" name="btnupdateprice" alt="Update Price" border="0"/>
</td>
</tr>
</table>

想要价格,其实只有一个地方可以看!

//span[@itemprop="price"]/text()

这将返回:

$149.95

关于python - 为什么这个 xpath 在 python 中使用 lxml 失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23900348/

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