使用 Python 请求和 lxml 从 HTML 列表中提取 text/numbers
Extracting text/numbers from HTML list using Python requests and lxml
我正在尝试使用 Python 请求和 lxml 从亚马逊上的商品中提取 'Seller rank'。所以:
<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() 在这种情况下不是正确的用法,我需要放别的东西?
非常感谢任何帮助。
您得到的是一个空列表,因为在 url 的一次调用中您没有得到网页的完整数据。为此,您必须流式传输 url 并以小块的形式获取所有数据。然后在 non-empty 块中找出所需的。以下代码是:-
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
我正在尝试使用 Python 请求和 lxml 从亚马逊上的商品中提取 'Seller rank'。所以:
<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() 在这种情况下不是正确的用法,我需要放别的东西? 非常感谢任何帮助。
您得到的是一个空列表,因为在 url 的一次调用中您没有得到网页的完整数据。为此,您必须流式传输 url 并以小块的形式获取所有数据。然后在 non-empty 块中找出所需的。以下代码是:-
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