blt*_*yro 6 python xml xpath lxml
这是我试图从中获取数据的示例网页. 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)
Run Code Online (Sandbox Code Playgroud)
用.打印出树文本
print(tree.text_content().encode('utf-8'))
Run Code Online (Sandbox Code Playgroud)
显示数据存在,但似乎xpath无法找到它.有什么我想念的吗?我尝试过的大多数其他网站使用lxml和从chrome dev工具中获取的xpath都可以正常工作,但是我找到了一些空列表.
小智 13
浏览器经常更改提供给它的HTML以使其"有效".例如,如果您为浏览器提供此无效HTML:
<table>
<p>bad paragraph</p>
<tr><td>Note that cells and rows can be unclosed (and valid) in HTML
</table>
Run Code Online (Sandbox Code Playgroud)
为了呈现它,浏览器是有用的,并尝试使其成为有效的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>
Run Code Online (Sandbox Code Playgroud)
上面的内容是因为<p>aragraphs不能在<table>s和<tbody>s内推荐而改变了.浏览器对源应用的更改可能会有很大差异.有些会在表格之前放置无效元素,有些则在单元格之内,等等...
使用这个"固定"的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>
Run Code Online (Sandbox Code Playgroud)
如果我们尝试定位<td>单元格的文本,以下所有内容将为您提供大致正确的信息:
//td
//tr/td
//tbody/tr/td
/table/tbody/tr/td
/table//*/text()
Run Code Online (Sandbox Code Playgroud)
而这样的例子不胜枚举...
但是,通常浏览器会为您提供最精确(也是最不灵活)的XPath,它列出了DOM中的每个元素.在这种情况下:
/table[0]/tbody[0]/tr[0]/td[0]/text()
Run Code Online (Sandbox Code Playgroud)
这就是为什么开发人员工具生成的XPath在尝试使用原始HTML时经常会给你错误的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>
Run Code Online (Sandbox Code Playgroud)
如果你想要价格,实际上只有一个地方可以看!
//span[@itemprop="price"]/text()
Run Code Online (Sandbox Code Playgroud)
这将返回:
$149.95
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4877 次 |
| 最近记录: |