使用 lxml、xpath 和 css 选择器的 Python 脚本也返回空列表

标签 python xpath web-scraping css-selectors lxml

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

我已经尝试了 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。

xpath and css validation

最佳答案

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

当我使用 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 with proxy (Chrome) - 此处介绍得很好:

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

关于使用 lxml、xpath 和 css 选择器的 Python 脚本也返回空列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54720563/

相关文章:

python - 如何使用 googletrans 在 Python 中翻译 Pandas 系列?

python - 一个干净的 API,用于在 python 中进行函数调用线程化

javascript - 我可以使用 XPath 按 CSS 属性过滤元素吗?

r - 使用 rvest 进行网络抓取

javascript - 如何使用javascript导航获取页面上的所有链接?

python - 在 Python 中使用 xlrd 将数字 Excel 数据读取为文本

python - matlab 卷积 "same"到 numpy.convolve

javascript - 使用 xpath 通过 javascript 从 XML 中获取内容时遇到问题

c# - 是否存在用于两个 XmlDocuments 的 .NET XPath 'diff' 命令?

python - 无法将字符串和列表从一个函数返回到另一个函数