使用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
谢谢。
答案 0 :(得分:1)
我已经查看了该页面的html源代码,并且标识为chapterMenu
的元素的内容为空。
我认为你的问题是它是用javascript填充的,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。
所以你去;)
答案 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
元素。请告诉我们您到底想要找到什么。