【问题标题】:Python script using lxml, xpath and css selector also returning null list使用 lxml、xpath 和 css 选择器的 Python 脚本也返回空列表
【发布时间】:2019-07-10 06:14:39
【问题描述】:

我尝试使用带有 lxml 的 xpath 从 html 标记中抓取下一页的 href 链接。但是 xpath 正在返回 null 列表,而它是单独测试的,它似乎可以工作。

我已经尝试过 css 选择器和 xpath,它们都返回空列表。

代码返回空值,而 xpath 似乎工作正常。

import sys
import time
import urllib.request
import random
from lxml import html 
import lxml.html 
import csv,os,json
import requests
from time import sleep
from lxml import etree

username = 'username'
password = 'password'
port = port
session_id = random.random()
super_proxy_url = ('http://%s-session-%s:%s@zproxy.lum-superproxy.io:%d' %(username, session_id, password, port))
proxy_handler = urllib.request.ProxyHandler({
        'http': super_proxy_url,
        'https': super_proxy_url,})
opener = urllib.request.build_opener(proxy_handler)
opener.addheaders = \[('User-Agent', 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36')]
print('Performing request')

page = self.opener.open("https://www.amazon.com/s/ref=lp_3564986011_pg_2/133-0918882-0523213?rh=n%3A283155%2Cn%3A%211000%2Cn%3A1%2Cn%3A173508%2Cn%3A266162%2Cn%3A3564986011&page=2&ie=UTF8&qid=1550294588").read()
pageR = requests.get("https://www.amazon.com/s/ref=lp_3564986011_pg_2/133-0918882-0523213?rh=n%3A283155%2Cn%3A%211000%2Cn%3A1%2Cn%3A173508%2Cn%3A266162%2Cn%3A3564986011&page=2&ie=UTF8&qid=1550294588",headers={"User-Agent":"Mozilla/5.0"})

doc=html.fromstring(str(pageR))

html = lxml.html.fromstring(str(page))
links = html.cssselect('#pagnNextLink')
for link in links:
        print(link.attrib['href'])

linkRef = doc.xpath("//a[@id='pagnNextLink']/@href")
print(linkRef)
for post in linkRef:
    link="https://www.amazon.com%s" % post

我在这里尝试了两种方法,但似乎都不起作用。

我正在使用代理服务器来访问链接,它似乎可以工作,因为“doc”变量正在填充 html 内容。我检查了链接,并且在正确的页面上获取此 xpath/csslink。

【问题讨论】:

  • 你能把代码的顶部也显示出来吗?
  • 已更新.. @QHarr
  • 你能给我什么建议吗?我被困在这里:(@QHarr
  • 代理会掩盖上述问题,但它仍然没有响应,这正是我所关心的。
  • 我使用 xpath 检查了“标题”,而它显示了预期的输出。

标签: python xpath web-scraping css-selectors lxml


【解决方案1】:

更有经验的人可能会就您的设置提供更好的建议,所以我将简单地说明我的经历:

当我使用requests 时,有时会得到链接,有时却没有。如果不是,则响应表明它正在检查我不是机器人并确保我的浏览器允许 cookie。

使用 selenium,我在测试中可靠地得到了结果,尽管这可能不够快,或者出于其他原因,您可以选择。

from selenium import webdriver
d = webdriver.Chrome()
url = 'https://www.amazon.com/s/ref=lp_3564986011_pg_2/133-0918882-0523213?rh=n%3A283155%2Cn%3A%211000%2Cn%3A1%2Cn%3A173508%2Cn%3A266162%2Cn%3A3564986011&page=2&ie=UTF8&qid=1550294588'
d.get(url)
link = d.find_element_by_id('pagnNextLink').get_attribute('href')
print(link)

带代理的 Selenium (Firefox):

Running Selenium Webdriver with a proxy in Python

带代理的 Selenium (Chrome) - 在这里很好地介绍:

https://stackoverflow.com/a/11821751/6241235

【讨论】:

  • 感谢 selenium 代码,但到目前为止,我需要通过请求本身来完成此操作。
  • 明白了。希望有更多 Python 经验的人能发帖 :-)
猜你喜欢
  • 2019-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-02
  • 1970-01-01
  • 1970-01-01
  • 2016-05-08
  • 1970-01-01
相关资源
最近更新 更多