2016-01-11 2 views
0

Я пытаюсь извлечь «ранг продавца» из элементов на амазонке, используя запросы Python и lxml. Итак:Извлечение текста/чисел из списка HTML с использованием запросов 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 имеет около 100 пустых строк между «Amazon Бестселлеры Rank:».. И «957875» Неуверенный, если это осуществление мой результат)

Мой текущий код 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

Вы получаете пустой список, потому что при одном вызове 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 
+0

Большое спасибо, я не ожидал полностью закодированного ответа. Я все еще так благодарна за ответ. Я скорректировал инструкцию s = re.findall и размер блока, чтобы быть применимым к большим числам, и когда нет # включен, но это отлично работает. –

Смежные вопросы