【问题标题】:Scraping data with Python LXML XPath使用 Python LXML XPath 抓取数据
【发布时间】:2013-02-12 19:19:33
【问题描述】:

我正在尝试为网站解析

blahblahblah 
<a  href="THIS IS WHAT I WANT" title="NOT THIS">I DONT CARE ABOUT THIS EITHER</a>
blahblahblah 

(其中有很多,我希望它们都以某种标记化的形式出现)。问题是“a href”实际上有两个空格,而不仅仅是一个(有些是“a href”,我不想检索一个空格),所以使用 tree.xpath('//a/@ href') 不太好用。有人有什么建议吗?

谢谢!

【问题讨论】:

    标签: python html-parsing lxml


    【解决方案1】:

    此代码按预期工作:

    from lxml import etree
    
    file = "file:///path/to/file.html" # can be a http URL too
    doc = etree.parse(file)
    
    print doc.xpath('//a/@href')[0]
    

    编辑:AFAIK 不可能用 lxml 做你想做的事。

    您可以改用

    【讨论】:

    • 嗨,这可以提取带有一个空格的“a href”,但不能提取a和href之间有两个空格的“a href”。我只想要 a 和 href 之间有两个空格的链接。
    • 不,就像 tdelaney 所说,XML + Xpath 不关心空格。我的脚本处理这两种情况,只需删除[0](第一个元素)并添加另一个链接,它们都会显示出来。 (但听起来不可靠超过 1 天)
    【解决方案2】:

    不知道 LXML,但你绝对可以使用 BeautifulSoup,在页面上找到所有 &lt;a&gt;,然后创建一个 for 循环,在其中你将检查 &lt;a href=...&gt; 是否匹配你的正则表达式模式,如果匹配,比报废网址。

    【讨论】:

      【解决方案3】:

      “(有些是我不想检索的带有一个空格的“a href”)”

      我认为这意味着您只想定位 a 和 href 之间有多个空格的元素。 XML 允许标签名称和属性之间有任意数量的空格(空格、制表符、换行符都是允许的)。在解析文本并创建文档树时,空格将被丢弃。 LXML 和 XPATH 使用的是 Document 树中的 Node 对象,而不是用于生成树的原始文本。

      一种选择是使用正则表达式来查找您想要的文本。但实际上,既然这是完全有效的 XML/HTML,为什么还要删除一些空格呢?

      【讨论】:

      • 我正在抓取的网站有某些链接,它们是带有一个空格的“a ref”和带有两个空格的“a ref”。我只想要有两个空格的链接。使用 sputnik 的代码只检索带有一个空格的链接,而不是带有两个空格的链接(如果它同时检索了两个,我可以在我的最后做更多的解析,但事实并非如此!)
      • 好的,你可以阅读页面,替换('a href','a spaceyref'),加载xml并使用xpath找到spaceyref。
      【解决方案4】:

      使用 xpath 表达式查找所有节点,然后遍历所有这些节点以寻找匹配项,您可以通过以下方式获得节点的字符串表示:

      etree.tostring(node)
      

      供进一步参考:http://lxml.de/tutorial.html#elements-carry-attributes-as-a-dict

      【讨论】:

        猜你喜欢
        • 2018-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-23
        • 1970-01-01
        • 2016-04-20
        • 2018-07-19
        相关资源
        最近更新 更多