【问题标题】:Search for texts recursively under a td node in an html table在 html 表中的 td 节点下递归搜索文本
【发布时间】:2018-04-13 02:54:53
【问题描述】:

我正在用 Python 抓取一个 html 表。到目前为止,我已经成功解析出表格:

root = etree.fromstring(browser.page_source, etree.HTMLParser())
rows = root.xpath("//table[@class='ms-listviewtable']/tbody/tr")

现在我想用 for 循环一一解析每一行中的列:

for row in rows:
    cols = row.xpath("./td")
    texts = [col.xpath("./findtextforme()") for col in cols)]
    # findtextforme() is a imaginary functionality

为什么我不能简单地使用col.xpath("./text()")col.findtext("./")?因为他们放置文本的位置在该表的列之间甚至列内不一致,包括td/text()td/div/a/text()td/div/font/text()td/div/div/text()...等。

因此我想要一些可以在给定 td 节点下递归查找文本的东西。我怎样才能做到这一点?

【问题讨论】:

    标签: python xpath web-crawler lxml


    【解决方案1】:

    你可以做的是使用.text_content() 聚合一个 HTML 元素的“文本”:

    返回元素的文本内容,包括其子元素的文本内容,不带标记。

    texts = [col.text_content() for col in cols]
    

    【讨论】:

    • 它给了我AttributeError: 'lxml.etree._Element' object has no attribute 'text_content'
    • @ytu 对,你需要使用lxml.html.fromstring() 而不是etree.fromstring()。不要忘记import lxml.html
    • 我先是from lxml import html,然后是html.fromstring(browser.page_source, etree.HTMLParser()),但得到的是TypeError: Argument must be string or unicode
    • @ytu 只是为了检查一下,您已经省略了 etree.HTMLParser() 参数,对吧?
    • 哦! html.fromstring(browser.page_source, etree.HTMLParser()) 给了我TypeErrorhtml.fromstring(browser.page_source) 没有。多么神秘。请您告诉我html.fromstringetree.fromstring之间的区别?
    猜你喜欢
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 2017-06-22
    • 1970-01-01
    相关资源
    最近更新 更多