我正在尝试提取卖家排名'使用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在亚马逊畅销书排名:&#39;和&#39; 957875&#39;之间有大约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()在这个实例中不正确使用我需要放其他东西? 非常感谢任何帮助。
答案 0 :(得分:1)
您将获得一个空列表,因为在一次调用该网址时,您无法获得该网页的完整数据。为此,您必须流式传输网址并以小块的形式获取所有数据。然后在非空块中找出所需的内容。以下代码为: -
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