【问题标题】:Having trouble with the xpath syntax for retrieving img src attribute using Python使用 Python 检索 img src 属性的 xpath 语法有问题
【发布时间】:2013-11-27 01:35:01
【问题描述】:

我一直在尝试找出解析此 html 的 xpath 语法,但我没有得到与其他人相同的结果。之后我一直在为我的工作建模,http://docs.python-guide.org/en/latest/scenarios/scrape/#web-scraping,但我无法让它为我的 html 工作。

<div id="sku-8103">
    <!-- B:649 -->
    <input type="hidden" id="productIdPDP" value="1218866963585"/>
    <input type="hidden" id="skuIdPDP" value="8240103" />
    <input type="hidden" id="enableLightbox" value="" />
    <!-- B:780 -->
    <img src="http://images.bestbuy.com/BestBuy_US/en_US/images/global/buttons/btn_notorderable_pdp.gif" alt="Not Orderable" border="0" id="notorderable" />
    <input name="8240103" type="hidden" value="1">
    <!-- E:780 -->
    <!-- E:649 -->
    </div>

我的代码:

import pycurl
import sys
import cStringIO
from lxml import etree
from lxml import html

buf = cStringIO.StringIO()

c = pycurl.Curl()
c.setopt(c.URL, 'http://www.bestbuy.com/site/sony-playstation-4-500gb/8240103.p?id=1218866963585&skuId=8240103')
c.setopt(c.WRITEFUNCTION, buf.write)
c.perform()

data = buf.getvalue()
buf.close()

tree = html.fromstring(data)


product = tree.xpath('//div[@id="sku-8240103"]/img[@src]')
print product

输出是:[],而不是图像的 src 值。我也试过了:

product = tree.xpath('//div[@id="sku-8240103"]/img[@src]/text()')

但这似乎也不起作用。

【问题讨论】:

    标签: python xpath web-scraping lxml elementtree


    【解决方案1】:

    你的 HTML 有这个:

    <div id="sku-8103">
    

    你正在用这个搜索:

    product = tree.xpath('//div[@id="sku-8240103"]/img[@src]')
    

    注意到不同的 SKU 编号了吗?没有匹配的节点,因此您会返回空列表[]

    如果你像这样改变它:

    product = tree.xpath('//div[@id="sku-8103"]/img[@src]')
    

    您现在得到一个单元素列表,如下所示:

    [<Element img at 0x10c85b890>]
    

    如果你这样做:

    print product[0].attrib['src']
    

    ……你明白了:

    http://images.bestbuy.com/BestBuy_US/en_US/images/global/buttons/btn_notorderable_pdp.gif
    

    真的,您不需要那里的[@src] 部分;如果您尝试将其限制为具有src 属性的imgs……您还希望看到什么其他imgs?

    【讨论】:

    • 好收获! ...但这只是我的帖子的错字。但是,看起来 print(product[0].attrib['src']) 确实有效,而不仅仅是打印产品。你知道为什么打印产品不起作用吗?不就是一个清单吗?
    • @user1152532:它确实有效。你看到[&lt;Element img at 0x10c85b890&gt;]了吗?这是我在运行代码的最后三行时复制并粘贴的输出,其中 SKU 已修复,针对您的数据。这是一个包含一个 img Element 对象的列表。
    • @user1152532:如果你得到一个空列表,你一定有一些 other 错字。要么这样,要么你在从真实页面复制 HTML 时搞砸了。
    • 对...我想我很好奇为什么print products 没有产生元素对象的全部内容。我习惯使用 JSON,当我打印整个对象时,也会打印子对象。
    • @user1152532:同时,当您解析 JSON 字符串时,您不会得到“JSON 对象树”或任何东西;你只会得到一个 Python dict 充满 Python dicts 和 lists 和 strs 等等。这是因为 JSON 专门设计为仅保存所有脚本语言共有的简单类型。这不适用于 HTML 或 XML。
    猜你喜欢
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    相关资源
    最近更新 更多