【问题标题】:Cant Scrape webpage with Python Requests Library无法使用 Python 请求库抓取网页
【发布时间】:2015-06-24 20:27:56
【问题描述】:

我正在尝试使用 Python 中的请求从网页(下面的链接)获取一些信息;但是,当我通过 python 的请求库连接时,我在浏览器中看到的 HTML 数据似乎不存在。没有任何 xpath 查询返回任何信息。我可以使用对其他网站的请求,例如亚马逊(下面的网站实际上归亚马逊所有,但我似乎无法从中获取任何信息)。

url = 'http://www.myhabit.com/#page=d&dept=men&asin=B00R5TK3SS&cAsin=B00DNNZIIK&qid=aps-0QRWKNQG094M3PZKX5ST-1429238272673&sindex=0&discovery=search&ref=qd_men_sr_1_0'
user_agent = {'User-agent': 'Mozilla/5.0'} 
page = requests.get(url, headers=user_agent)
tree = html.fromstring(page.text)
query = tree.xpath("//span[@id=ourPrice]/text()")

【问题讨论】:

  • 您的url 不在引号中,因此它不是字符串。
  • 它似乎正在使用 javascript 和 ajax 加载产品描述。
  • 事实上,几乎网站内容都是在 javascript XHR 调用下构建的。

标签: python html xpath


【解决方案1】:

这里是代码,我如何从一个站点废弃一张表。在那个站点中,他们没有在表中定义 id 或 class,因此您无需放置任何内容。如果 id 或 class 意味着只使用 html.xpath('//table[@id=id_val]/tr') 而不是 html.xpath('//table/tr')

from lxml import etree
import urllib
web = urllib.urlopen("http://www.yourpage.com/")
html = etree.HTML(web.read())
tr_nodes = html.xpath('//table/tr')
td_content = [tr.xpath('td') for tr in tr_nodes  if [td.text for td in tr.xpath('td')][2] == 'Chennai' or [td.text for td in tr.xpath('td')][2] == 'Across India'  or 'Chennai' in [td.text for td in tr.xpath('td')][2].split('/') ]
main_list = []
for i in td_content:
    if i[5].text == 'Freshers' or  'Freshers' in i[5].text.split('/') or  '0' in i[5].text.split(' '):
       sub_list = [td.text for td in i]
       sub_list.insert(6,'http://yourpage.com/%s'%i[6].xpath('a')[0].get('href'))
       main_list.append(sub_list)
print 'main_list',main_list

【讨论】:

    【解决方案2】:

    元素是使用javascript生成的,可以使用selenium获取源码,结合phantomjs获取无头浏览:

    url = 'http://www.myhabit.com/#page=d&dept=men&asin=B00R5TK3SS&cAsin=B00DNNZIIK&qid=aps-0QRWKNQG094M3PZKX5ST-1429238272673&sindex=0&discovery=search&ref=qd_men_sr_1_0'
    
    from selenium import webdriver
    
    browser = webdriver.PhantomJS()
    browser.get(url)
    _html = browser.page_source
    
    from bs4 import BeautifulSoup
    
    print(BeautifulSoup(_html).find("span",{"id":"ourPrice"}).text)
    $50
    

    【讨论】:

    • 这很棒。我完全按照您的建议使用了,除了我向 phantomjs.exe 浏览器添加了一个可执行路径 = webdriver.PhantomJS(executable_path=path) 这似乎在大多数情况下都有效;但是有时它返回 null 有时返回 '$50'。什么可能导致不一致?
    • 您可能只需要添加一个等待。文档selenium-python.readthedocs.org/en/latest/waits.html 中有一些很好的例子
    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 2018-03-22
    • 2016-02-21
    • 1970-01-01
    • 2020-04-20
    相关资源
    最近更新 更多