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

时间:2015-03-12 16:36:49

标签: python xpath web-crawler lxml python-requests

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

页面网址为www.mangapanda.com/one-piece/1/1

我想从下拉选择标记中提取所选的章节名称文本。现在我只想要第一个选项,以便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

谢谢。

2 个答案:

答案 0 :(得分:1)

我已经查看了该页面的html源代码,并且标识为chapterMenu的元素的内容为空。 我认为你的问题是它是用javascript填充的,javascript只是通过用lxml.html

读取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。 但是,如果要自动执行此操作,则必须了解如何获取idwhich参数。

id是html的一部分,在其中一个脚本标签中查找document['mangaid']which 可以保留191919 必须为0 ... 虽然我无法在任何来源找到它但我发现它,当它为0时,你将被重定向到正确的URL。

所以你去;)

答案 1 :(得分:0)

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

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

即使Firepath没有告诉你这件事。处理命名空间的正确方法是在代码中重新声明它们,这意味着将它们与前缀相关联,然后在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元素。请告诉我们您到底想要找到什么。