【问题标题】:XPath returns different results using Chrome Plugin and PythonXPath 使用 Chrome 插件和 Python 返回不同的结果
【发布时间】:2019-05-22 23:29:30
【问题描述】:

我正在努力在 HTML 代码上使用 XPath 来查找我需要的信息。

我已经尝试了几个查询,但它们一直在 python 中返回一个空列表。所以我安装了一个 chrome 插件来检查我的查询是否错误,结果不是,所以我现在完全糊涂了。我的整个方法是错误的还是我在这里遗漏了什么?

import requests
from lxml import html


#specify the url
base_url = 'https://www.lolesports.com/en_US/na- 
lcs/na_2018_summer/schedule/regular_season/2'

#query the website and return the html to the variable ‘html_code’
html_code = requests.get(base_url)

tree = html.fromstring(html_code.content)
my_nodes = tree.xpath('//a[@id="ember9461"]') ## here it keeps returning an empty list

尝试了几个都不起作用的查询,除了我无法进一步解析的广泛通配符“//*”。

我想为一周内的每场比赛解析 href 中提供的链接(例如)'a id="ember9461" ....... /a'。所以最好返回一个包含所有这些链接的列表,或者至少返回一个包含链接的列表,我可以进一步解析。但正如我之前所说,我不断得到一个空数组,尽管它是 Chrome 的 XPath 插件显示的正确 XPath。

感谢任何帮助。谢谢!

这是我的第一个问题,如果我知道怎么做,我会回来添加截图:)

编辑:它被要求输出:嗯,我没有收到错误,只是描述的“my_nodes”空列表。我正在使用 PyCharm 8.13。

my_nodes = {list}<class 'list'>: []

除了一个空列表之外,我会期待任何内容,因为查询是使用 XPath 插件工作的。

这是解释问题的屏幕截图:

query with XPath Plugin

【问题讨论】:

  • 欢迎来到 Stackoverflow。 〜如果您包含您使用的确切输入和输出,您将获得更好的响应,以便更容易确定可能出现的问题。在stackoverflow.com/help/how-to-ask 上有关于如何写问题的建议。使用文本评分器而不是屏幕截图,以便其他人可以使用它们!
  • 好的,我添加了 my_nodes 的输出/结果,并进一步添加了屏幕截图以便进一步澄清

标签: python html parsing web-scraping lxml


【解决方案1】:

我认为您可能需要像 selenium 这样的方法,您可以在其中滚动以生成所有链接并留出时间让它们出现

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup as bs
from urllib.parse import urljoin
base = 'https://www.lolesports.com'
url = 'https://www.lolesports.com/en_US/na-lcs/na_2018_summer/schedule/regular_season/1'
d = webdriver.Chrome()
d.get(url)
WebDriverWait(d, 20).until(EC.invisibility_of_element_located((By.CSS_SELECTOR, ".throbber-loader")))
copyright = WebDriverWait(d, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".copyright-text")))
d.execute_script("return arguments[0].scrollIntoView(true);", copyright)
WebDriverWait(d,5).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, '.ember-view')))
soup = bs(d.page_source,'lxml')
links = [urljoin(base,link.get('href')) for link in soup.select('.ember-view') if link.get('href')]
print(len(links))
print(links)
d.quit()

仅硒:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from urllib.parse import urljoin

base = 'https://www.lolesports.com'
url = 'https://www.lolesports.com/en_US/na-lcs/na_2018_summer/schedule/regular_season/1'
d = webdriver.Chrome()
d.get(url)
WebDriverWait(d, 20).until(EC.invisibility_of_element_located((By.CSS_SELECTOR, ".throbber-loader")))
copyright = WebDriverWait(d, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".copyright-text")))
d.execute_script("return arguments[0].scrollIntoView(true);", copyright)
elems = WebDriverWait(d,5).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, '.ember-view[href]')))

links = []
for elem in elems:
    links.append(urljoin(base,elem.get_attribute('href')))

print(len(links))
print(links)
d.quit()

【讨论】:

  • 你是我的圣诞老人!它正在工作!不过,完全不同的方法,我需要支持该代码。安装 Chromedriver 并设置它后,您的代码会提供我正在寻找的链接。非常感谢!我投了赞成票,但由于我的初学者声誉,它显然尚未显示:)
  • 我使用 css 选择器而不是 xpath。我等待加载微调器消失,滚动到页面底部,等待您之后出现的所有元素(使用 css 类选择器),然后仅限于那些在理解中带有 href 的类。出于某种原因,python bs4 实现似乎不喜欢 .emberview[href] 的更直接的 css 选择器。从技术上讲,你根本不需要 bs4,因为它都可以用 selenium 完成。
【解决方案2】:

祝你圣诞快乐 :)

据我所知,您的语法是正确的并且实际上返回了一些东西。问题是,它不会返回可以用您的 XPath 查询(检查 html_content)来解析的内容以供您自己查看。这解释了为什么它返回一个空列表。

希望这会有所帮助。

【讨论】:

  • 知道如何提取 html 代码给出的 href 信息吗?我需要另一种方法吗?
  • 您需要另一种方法。我在 html_code = requests.get(base_url) 返回的内容中看不到太多 HTML 代码
猜你喜欢
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-26
  • 1970-01-01
  • 2021-05-31
相关资源
最近更新 更多