【问题标题】:XPath expression to select text not in paragraphXPath 表达式选择不在段落中的文本
【发布时间】:2010-08-07 07:37:26
【问题描述】:

我正在开发依赖 XPath 从网页中提取信息的网络抓取软件。

该软件的一个应用是从网站上抓取节目评论。我试图抓取的一页是《卫报》最新的爱丁堡音乐节评论:http://www.guardian.co.uk/culture/edinburghfestival+tone/reviews

我想要的部分在底部,标题为“最新”。评论项目列表(即图片、星星、日期、简介等)的 XPath 表达式是

//ul[@id='auto-trail-block']

返回一个 li 元素列表,每个元素对应一个评论项。

如果我只想参考简介,我能得到的最接近的就是说

//ul[@id='auto-trail-block']/div[@class='trailtext']

但是当我从列表的每个项目中收集文本内容时,它包含了很多我不需要的 Javascript 和讨厌的东西。我不能引用简介本身,因为它不在 p 元素内,而是在一个 div 元素内,该元素包含 script 元素和分别包含 javascript 和不相关文本的强元素。

在调试器中,DOM 看起来像这样:

<ul id="auto-trail-block" ...>
  <li ...>
    <div ...>
    <div ...>
      <div ...>
      <div class="trailtext">
        <script ...>
        <div ...>
        <span ...>
        <strong .../>
        <br/>
        The Text I want to copy!
        <strong .../>
        <a .../>
        <div .../>
      </div>
    </div>
  </li>
  <li ...>
    ...
  </li>
  ...
</ul>

有什么方法可以引用仅包含在 div 中而不是其任何子元素中的文本内容?

【问题讨论】:

  • 从您的输入示例中,您想要的文本节点是 div[@class='trailtext'] 的子节点还是脚本元素后 div 的子节点并不清楚。

标签: xpath screen-scraping


【解决方案1】:

我的方法是选择 trailtext div,删除脚本标签及其内容和所有 HTML 标签。剩下的就是你想要的内容了。

只是想知道 - //ul[@id='auto-trail-block']/div[@class='trailtext'] 的内部文本节点返回什么?我猜主要是宣传,所以清除脚本标签应该几乎可以让你到达那里。

【讨论】:

    【解决方案2】:

    如果您只想要 div[@class='trailtext'] 的文本节点子节点,则使用 text()

    //ul[@id='auto-trail-block']//div[@class='trailtext']/text()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-16
      • 1970-01-01
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-23
      • 2018-05-04
      相关资源
      最近更新 更多