用于选择不在段落中的文本的XPath表达式

时间:2010-08-07 07:37:26

标签: xpath screen-scraping

我正在推出依赖XPath从网页中提取信息的网页抓取软件。

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

我想要的部分位于底部,标题为“最近的”。评论项目列表的XPath表达式(即pic,星星,日期,模糊等)是

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

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

如果我只想引用模糊,我最接近的就是说

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

但是当我收集列表中每个项目的文本内容时,它包含了许多我不需要的Javascript和令人讨厌的东西。我不能引用blurb本身,因为它不在p元素内,而是在包含脚本元素和包含javascript和无关文本的强元素的div元素中。

在调试器中,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中包含的文本内容而不是它的任何子元素?

2 个答案:

答案 0 :(得分:1)

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

只是想知道 - //ul[@id='auto-trail-block']/div[@class='trailtext']的内部文本节点返回了什么?我猜大多数都是模糊的,所以清除脚本标签几乎可以让你到那儿。

答案 1 :(得分:1)

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

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