在 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。
但是如果你想自动执行此操作,你必须找出如何获取 id
和 which
参数。
ID 是 html 的一部分,在其中一个脚本标签中寻找 document['mangaid']
,which
可能会保留 191919必须是 0... 虽然我在任何来源都找不到它 我找到了,当它是 0 时你将被重定向到正确的 url.
好了 ;)
我在使用 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
您可能想看看这个: 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。
但是如果你想自动执行此操作,你必须找出如何获取 id
和 which
参数。
ID 是 html 的一部分,在其中一个脚本标签中寻找 document['mangaid']
,which
可能会保留 191919必须是 0... 虽然我在任何来源都找不到它 我找到了,当它是 0 时你将被重定向到正确的 url.
好了 ;)