在 Python 中使用 lxml XPath 从网页中提取数据

Extracting data from webpage using lxml XPath in Python

我在使用 xpath 从 lxml 库的 HTML 页面检索文本时遇到了一些未知问题。

页面 url 是 www.mangapanda。com/one-piece/1/1

我想从下拉 select 标签中提取 selected 章节名称文本。现在我只想要第一个选项,这样 XPath 就很容易找到它。即:-

.//*[@id='chapterMenu']/option[1]/text()

我使用 Firepath 验证了上面的内容,它给出了正确的数据。但是当我尝试使用 lxml 时,我根本得不到数据。

from lxml import html
import requests

r = requests.get("http://www.mangapanda.com/one-piece/1/1")
page = html.fromstring(r.text)

name = page.xpath(".//*[@id='chapterMenu']/option[1]/text()")

但名义上没有存储任何内容。我什至尝试了其他 XPath,例如:-

//div/select[@id='chapterMenu']/option[1]/text()
//select[@id='chapterMenu']/option[1]/text()

以上内容也使用 FirePath 进行了验证。我无法弄清楚可能是什么问题。我会请求有关此问题的一些帮助。

但并不是所有的都不起作用。此处使用 lxml xpath 的 xpath 是:-

.//img[@id='img']/@src

谢谢。

您请求的页面的源文档位于默认命名空间:

<html xmlns="http://www.w3.org/1999/xhtml">

即使 Firepath 没有告诉你这件事。处理名称空间的正确方法是在您的代码中 重新声明 它们,这意味着将它们与 prefix 相关联,然后在 XPath 表达式中为元素名称添加前缀.

name = page.xpath('//*[@id='chapterMenu']/xhtml:option[1]/text()',
   namespaces={'xhtml': 'http://www.w3.org/1999/xhtml'})

那么,上面的路径表达式所关注的那块文档是:

<select id="chapterMenu" name="chapterMenu"></select>

如您所见,其中没有 option 元素。请告诉我们您想要查找的内容。

我查看了该页面的 html 来源,id 为 chapterMenu 的元素的内容是空的。 我认为您的问题是它是使用 javascript 填充的,而仅通过使用 lxml.html

读取 html 不会自动评估 javascript

您可能想看看这个: Evaluate javascript on a local html file (without browser)

也许你可以欺骗它...最后,javascript 也需要使用 get 请求来获取信息。在这种情况下,它请求:http://www.mangapanda.com/actions/selector/?id=103&which=191919

它是 json,可以使用 json 库轻松地变成 python dict/array。 但是如果你想自动执行此操作,你必须找出如何获取 idwhich 参数。

ID 是 html 的一部分,在其中一个脚本标签中寻找 document['mangaid']which 可能会保留 191919必须是 0... 虽然我在任何来源都找不到它 我找到了,当它是 0 时你将被重定向到正确的 url.

好了 ;)