为什么此xpath在python中使用lxml失败?

bltpyro

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

xpath是从chrome开发工具中获取的,firefox中的firepath也能够找到它,但是使用lxml时,它只会为“文本”返回一个空列表。

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>aragraph不能位于<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()

而这样的例子不胜枚举...

但是,一般而言,浏览器将为您提供最精确(且最不灵活)的XPath,该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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么此xpath在python中使用lxml失败?

来自分类Dev

在 Python 中使用 XPath 和 ETXPath 的 LXML

来自分类Dev

为什么此Python测试失败?

来自分类Dev

为什么针对子文本内容的此XPath测试失败?

来自分类Dev

为什么我使用xpath lxml在python中收到一个空数组

来自分类Dev

为什么使用xpath获取属性失败?

来自分类Dev

为什么python lxml etree xpath返回多个元素?

来自分类Dev

为什么此返回失败?

来自分类Dev

为什么此日历失败?

来自分类Dev

为什么此macrodef失败?

来自分类Dev

为什么此Sparkpost Python SDK安装失败?

来自分类Dev

为什么此Sparkpost Python SDK安装失败?

来自分类Dev

为什么在第三行中使用此“ _”?Python2.7

来自分类Dev

Python,如何使用lxml XPath?

来自分类Dev

为什么要在is.wholenumber中使用此公差

来自分类Dev

为什么在构造函数中使用此关键字

来自分类Dev

为什么在jsp中使用if语句会出现此错误?

来自分类Dev

Python 结构,为什么 grep 使用 [] 失败

来自分类Dev

为什么在ssh会话中使用管道读取失败?

来自分类Dev

为什么在 Swift 4 中使用委托传递数据失败

来自分类Dev

为什么此C ++程序编译失败?

来自分类Dev

为什么此JavaScript废话警报“失败”?

来自分类Dev

为什么此汇编代码失败?

来自分类Dev

为什么此用户定义的转换失败?

来自分类Dev

为什么此SQL查询失败

来自分类Dev

为什么此函数指针失败?

来自分类Dev

为什么此gradle flatDir示例失败?

来自分类Dev

为什么此多处理代码失败?

来自分类Dev

为什么此模板推断失败