【问题标题】:how can I handle inconsistent markup?如何处理不一致的标记?
【发布时间】:2012-08-22 00:56:21
【问题描述】:

我有一个项目,我必须从许多页面中抓取许多 URL。我认为每个页面的结构都将保持不变,但有时它会改变并破坏我的代码。

例如,我需要提取一篇文章的摘要及其关键字,它们都在一个单独的<p> 与同一类"marginB3" 中。于是我刮了一页,只得到了两个结果,一个是摘要,另一个是关键字:

hxs = HtmlXPathSelector(response)
lista =  hxs.select('//p[@class="marginB3"]/text()')  
self.abstracto = lista[0].extract()
self.keywords = lista[1].extract()

然后我尝试了第三页,出现了一个新的<p>,其中包含有关该文章的一些附加信息并更改了结构。这使它变得更加复杂,因为没有 id 而只有类。如果没有id的关键字上面有自己的<h2>,我如何区分哪个是<p>

<h2>Info</h2>
<p class="marginB3">a_url_I_want</p>

我可以通过阅读 &lt;h2&gt; 和下面的 &lt;p&gt; 来进行区分吗?

【问题讨论】:

    标签: xpath scrapy web-crawler


    【解决方案1】:

    你当然可以。

    试试这个:

    # First <p>
    hxs.select('//h2/following-sibling::p[@class="marginB3"][1]/text()').extract()
    # Second <p>
    hxs.select('//h2/following-sibling::p[@class="marginB3"][2]/text()').extract()
    

    【讨论】:

      【解决方案2】:

      我不是 XPATH 专家,但我认为您需要查看 following 轴以捕获 &lt;h2&gt; 标记之后的项目。

      一般来说,当您尝试解析的文档没有很好地标记时,XPATH 的效果很差。冒着增加更多复杂性的风险,您可以查看BeautifulSoup 模块之类的东西,它允许以更程序化的方式处理不一致的标记。 XPATH (大部分)是一种声明性语言,而声明性语言很难应对非常规输入。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-09
        • 1970-01-01
        • 2015-08-02
        • 2020-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多