使用 Chrome 插件和 Python 的 XPath returns 不同结果

XPath returns different results using Chrome Plugin and Python

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

我尝试了几个查询,但他们在 python 中保留了一个空列表 return。所以我安装了一个 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'。所以最好 return 包含所有这些链接的列表或至少包含链接的列表,我可以进一步解析。但正如我之前所说,我一直得到一个空数组,尽管它是 Chrome.

的 XPath 插件显示的正确 XPath

感谢任何帮助。谢谢!

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

编辑:要求输出:好吧,我没有收到错误,只是描述了 "my_nodes" 的空列表。我正在使用 PyCharm 8.13.

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

除了一个空列表,我希望得到任何结果,因为查询正在使用 XPath 插件。

这是解释问题的截图:

query with XPath Plugin

祝你圣诞快乐 :)

据我所知,您的语法是正确的,实际上 return 有点意思。问题是,它没有 return 可以用您自己的 XPath 查询(检查 html_content)解析的东西。这就解释了为什么它 return 是一个空列表。

希望对您有所帮助。

我认为您可能需要像 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()