Python 数据刮取XPath范围不返回任何值

Python 数据刮取XPath范围不返回任何值,python,html,xpath,web-scraping,Python,Html,Xpath,Web Scraping,我正试图从一个在线评论网站上检索有用性指标。我使用Python和lxml尝试检索该值,但是输出仍然为空。我使用了以下代码和相应的XPath: span class=“brand-find-usiver\uu count”>1 tree=html.fromstring(第页) helpfully=tree.xpath('//span[@class=“brand-find-use\uu count”]/text()) 然而,它并没有给我一个输出,只是一个空值。重要的是要注意,当没有竖起大拇指(有用)

我正试图从一个在线评论网站上检索有用性指标。我使用Python和lxml尝试检索该值,但是输出仍然为空。我使用了以下代码和相应的XPath:

span class=“brand-find-usiver\uu count”>1

tree=html.fromstring(第页)
helpfully=tree.xpath('//span[@class=“brand-find-use\uu count”]/text())

然而,它并没有给我一个输出,只是一个空值。重要的是要注意,当没有竖起大拇指(有用)时,这个跨度不会显示出来。我在一个肯定有有用计数的页面上尝试了几次“知道”,但不幸的是,我无法检索到它。我还是个新手,但我不知道错误是什么

您使用了错误的xpath,
//span[@class=“brand-find-use\uu count”]/text()
不是有效的xpath,因为它仅在您有JavaScript呈现的输出时出现。您可以通过查看浏览器中的页面源来验证这一点(不使用devtools)

您还将在视图源代码中找到包含评论json数据的脚本标记,您可以使用该json字符串,而不是从元素中获取数据。我会让你检查的

下面的代码显示了如何从页面中获取帮助计数

解决方案

输出


请参见操作。

您也可以使用
选择
,然后提取相关属性

import requests
from bs4 import BeautifulSoup as bs

r = requests.get('https://www.trustpilot.com/review/www.trivago.co.uk?page=4')
soup = bs(r.content, 'lxml')

for review in soup.select('.review'):
    useful = review.select_one('brand-find-useful-button')
    print(useful[':initial-find-useful-count'])

tree.xpath('//span[@class=“brand-find-usful\uu count”]/text())
返回一个列表,您可以使用
tree.xpath('//span[@class=“brand-find-usful\uu count”]/text())[0]
获取文本。感谢您的快速回复。如果我这样做,我会得到:'索引器:列表索引超出范围'。您好@Principia,欢迎使用堆栈溢出!:-)。我不确定XML和网站。HTML不是XML,这可能会给您带来一些问题。也许美丽的汤库更合适?它允许使用CSS选择器查询HTML树()感谢@mhogerheijde的欢迎和建议。我会调查的。我从xpath方法开始思考,也许有一种方法可以解决它。谢谢,我会去看看漂亮的汤。url是什么?HTML和XML都是常规语言。我建议不要使用正则表达式来解析HTML(或XML),因为您将很快发现无法解决的错误。@mhogerheijde我不是用正则表达式解析HTML本身。我正在分析一个字符串。我非常明确地确保我也在使用特定的字符串。html是用bs4解析的,就像节点匹配一样。你是在解释标签的字符串表示,对吗?在我的书中,这就是解析。如果我错了,请纠正我,但是
str(有用)
的结果是
最后一部分实际上是一个很好的观点,我错过了它,所以谢谢你。更新了。哇,太好了,这确实有效!关于这一点有一个小问题——虽然我确实看到了Python中的输出,但当我查看列表时,它显示的是“HtmleElement”,而不是数字。我是否需要在脚本中添加一些内容来将值“HtmlElement”转换为相应的数字输出?从长远来看,我希望在几个页面上运行脚本,然后将其附加。@Principia
有用的
是一个HTMLElements列表,因为该值存在于属性中,我们不能只使用
text()
.text
。您可以将
e.get(':initial find-usivery count')
附加到列表中以供以后使用。
import requests
from lxml import html

response = requests.get('https://www.trustpilot.com/review/www.trivago.co.uk?page=4')

tree = html.fromstring(response.text)

# fetches all useful elements 
useful = tree.xpath('//brand-find-useful-button')

# loop through each element
for e in useful:
  print(e.get(':initial-find-useful-count'))
1
1
0
1
0
2
2
1
2
0
1
0
0
1
1
1
1
1
1
import requests
from bs4 import BeautifulSoup as bs

r = requests.get('https://www.trustpilot.com/review/www.trivago.co.uk?page=4')
soup = bs(r.content, 'lxml')

for review in soup.select('.review'):
    useful = review.select_one('brand-find-useful-button')
    print(useful[':initial-find-useful-count'])