这是我尝试从中获取数据的示例网页。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可以正常工作的大多数其他站点,但我发现其中的一些站点给出了空列表。
浏览器经常更改为其提供的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>
因此建议使用。应用于源的更改可能因浏览器而异。有些会将无效元素放在表格之前,有些放在表格后面,有些放在内部单元格中,等等。
使用此“固定” 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()
这就是为什么在尝试使用原始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] 删除。
我来说两句