【问题标题】:XPath on subselection of an HTML page selecting extra elements?选择额外元素的 HTML 页面的子选择上的 XPath?
【发布时间】:2021-03-18 16:16:56
【问题描述】:

我正在网页抓取一个多页目录,每页上有 100 个表行条目。 我已经下载了相关页面并将它们存储为泡菜文件。 在尝试提取信息时,我遇到了一个我不明白的奇怪问题:

我两次调用 XPath:

  1. 首先选择表格行。结果存储在列表中。这很好用。
  2. 在已保存的表格行列表中排名第二。我希望 xpath 只检查该范围。但是,发生的情况是 xpath 从所有表行中检索信息。那时甚至不应该提供给它的信息。
def information_extraction():
    website = store.unpickle_objects('test')
    utf8_parser = lxml.html.HTMLParser(encoding = "utf-8") # Handling encoding issues
    for page in website:
        page_content = lxml.html.fromstring(page, parser= utf8_parser)
        list = page_content.xpath('//table[contains(@id,"R1")]/tbody/tr')
        print ("Length list: ", len(list),", Type: ", type(list))# List with 100 table rows
        list_element = list[0]
        print (lxml.html.tostring(list_element)) # 1 row, correct html snippet
        first_link = list_element.xpath('//td[1]/a/@href')
        print(first_link) #Error, I get a list of all 100 occurrences from list and not the 1 contained in list_element

我正在使用 Python 3。

【问题讨论】:

  • 尝试通过添加前导句点使您的 XPath 相对:.//td[1]/a/@href
  • 谢谢@kjhughes:一个额外的“。”就是所需要的,相对路径按预期工作。现在知道要搜索什么了,我找到了这个explanation。
  • @Timoth04:因为这对你有用,我已经添加了一个完整的答案和解释below。

标签: python html xml web-scraping xpath


【解决方案1】:

通过添加前导句点使您的 XPath 相对于上下文节点:

.//td[1]/a/@href

没有前导句点,XPath 是绝对的,这意味着它使用根节点作为上下文,从而搜索整个文档。

另见What is the difference between // and .// in XPath?

【讨论】:

    猜你喜欢
    • 2022-07-01
    • 2021-02-23
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 2012-03-29
    • 2019-12-03
    • 2017-07-22
    相关资源
    最近更新 更多