【问题标题】:Extracting text/numbers from HTML list using Python requests and lxml使用 Python 请求和 lxml 从 HTML 列表中提取文本/数字
【发布时间】:2016-01-11 11:18:08
【问题描述】:

我正在尝试使用 Python 请求和 lxml 从亚马逊上的商品中提取“卖家排名”。所以:

<li id="SalesRank">
<b>Amazon Bestsellers Rank:</b> 

957,875 in Books (<a href="http://www.amazon.co.uk/gp/bestsellers/books/ref=pd_dp_ts_b_1">See Top 100 in Books</a>)

在这个例子中,957875 是我要提取的数字。

(请注意,实际的 HTML 在“Amazon Bestsellers Rank:”和“957875”之间有大约 100 个空白行。不确定这是否会影响我的结果。)

我当前的 Python 代码是这样设置的:

import re
import requests
from lxml import html

page = requests.get('http://www.amazon.co.uk/Lakeland-Expanding-Together-Compartments-Organiser/dp/B00A7Q77GM/ref=sr_1_1?s=kitchen&ie=UTF8&qid=1452504370&sr=1-1-spons&psc=1')
tree = html.fromstring(page.content)
salesrank = tree.xpath('//li[@id="SalesRank"]/text()')
print 'Sales Rank:', salesrank

打印输出是 Sales Rank: []

我期待收到完整的列表数据,包括我稍后会解析的所有空白行。 我是否正确假设 /text() 在这种情况下不是正确的使用,我需要输入其他内容? 非常感谢任何帮助。

【问题讨论】:

    标签: python html python-requests lxml


    【解决方案1】:

    您将获得一个空列表,因为在一次调用 url 时您没有获得网页的完整数据。为此,您必须通过 url 流式传输并以小块的形式获取所有数据。然后在非空块中找出所需的。以下代码是:-

    import requests as rq
    import re
    from bs4 import BeautifulSoup as bs
    r=rq.get('http://www.amazon.in/gp/product/0007950306/ref=s9_al_bw_g14_i1?pf_rd_m=A1VBAL9TL5WCBF&pf_rd_s=merchandised-search-3&pf_rd_r=1XBKB22RGT2HBKH4K2NP&pf_rd_t=101&pf_rd_p=798805127&pf_rd_i=4143742031',stream=True)
    
    for chunk in r.iter_content(chunk_size=1024):
        if chunk:
            data = chunk
            soup=bs(data)
            elem=soup.find_all('li',attrs={'id':'SalesRank'})
            if elem!=[]:
                s=re.findall('#[\d+,*]*\sin',str(elem[0]))
                print s[0].split()[0]
                break
    

    【讨论】:

    • 非常感谢,我没想到会有完全编码的响应。还在学习中,谢谢回复。我调整了 s=re.findall 语句和块大小以适用于更大的数字,并且在不包含 # 时适用,但效果很好。
    猜你喜欢
    • 2016-05-11
    • 2017-08-05
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多