【问题标题】:python xpath returns empty list - exileadpython xpath 返回空列表 - exilead
【发布时间】:2018-11-14 21:37:33
【问题描述】:

我对使用 Python 进行抓取还很陌生。 我正在尝试从 Exilead 上的查询中获取搜索结果的数量。在这个example我想得到“ 586,564 个结果”。

这是我正在运行的代码:

r = requests.get(URL, headers=headers)
tree = html.fromstring(r.text)
stats = tree.xpath('//[@id="searchform"]/div/div/small/text()')

这会返回一个空列表。

我直接从元素页面复制粘贴了 xPath。
作为替代方案,我尝试使用 Beautiful soup:

html = r.text
soup = BeautifulSoup(html, 'xml')
stats = soup.find('small', {'class': 'pull-right'}).text

返回属性错误:NoneType 对象没有属性文本。

当我检查 html 源代码时,我意识到我实际上在源代码中找不到我正在寻找的元素(结果的数量)。

有谁知道为什么会发生这种情况以及如何解决? 非常感谢!

【问题讨论】:

  • 你试过没有 /text() 的 xpath 吗?然后获取innerHTML

标签: python xpath web-scraping beautifulsoup empty-list


【解决方案1】:

当我检查 html 源代码时,我意识到我实际上在源代码中找不到我正在寻找的元素(结果的数量)。

这表明您要查找的数据是使用 javascript 动态生成的。您需要能够在 html 源代码中看到您要查找的元素。

要确认这是您的错误的原因,您可以尝试一些非常简单的方法,例如:

html = r.text
soup = BeautifulSoup(html, 'lxml')

*注意上面的“lxml”。

然后手动检查“汤”,看看是否有你想要的元素。

【讨论】:

    【解决方案2】:

    我可以使用 small.pull-right 的 CSS 选择器组合来定位元素的标签和类名。

    from bs4 import BeautifulSoup
    import requests
    url = 'https://www.exalead.com/search/web/results/?q=lead+poisoning'
    res = requests.get(url)
    soup = BeautifulSoup(res.content, "lxml")
    print(soup.select_one('small.pull-right').text)
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    相关资源
    最近更新 更多