使用Python和lxml.html解析HTML

3
我是一个在scraperwiki.com上创建Python爬虫的开发者。我需要解析一个包含以下代码的html页面部分:
<div class="div_class">
    <h3>I'm a title. Don't touch me</h3>
    <ul>
        <li>
        I'm a title. Parse me
            <ul>
                <li>fdfdsfd</li>
                <li>fdfdsfd</li>
                <li>fdfdsfd</li>
                <li>fdfdsfd</li>
            </ul>
        </li>
        <li>
        I'm a title. Parse me
        <ul>
                <li>fdfdsfd</li>
                <li>fdfdsfd</li>
                <li>fdfdsfd</li>
                <li>fdfdsfd</li>
            </ul>
        </li>
        <li>
        I'm a title. Parse me
        <ul>
                <li>fdfdsfd</li>
                <li>fdfdsfd</li>
                <li>fdfdsfd</li>
                <li>fdfdsfd</li>
            </ul>
        </li>
        <li>
        I'm a title. Parse me
        <ul>
                <li>fdfdsfd</li>
                <li>fdfdsfd</li>
                <li>fdfdsfd</li>
                <li>fdfdsfd</li>
            </ul>
        </li>
    </ul>
</div>

我想仅解析“我是标题。解析我”标题。这是我正在使用的方法:

import scraperwiki
import lxml.html
import re 
import datetime
#.......................
raw_string = lxml.html.fromstring(scraperwiki.scrape(url_to_scrape))
raw_html = raw_string.cssselect("div.div_class ul > li")
for item in ras_html
  print(item.text_content())

我确实可以工作。但它捕获了

    内的所有数据。我不想要这样,我只想在每个
      中找到"I'm a title. Parse me",就这样。

      我该怎么做?

1个回答

4
< p > lxml 的美妙之处在于你可以使用 css 选择器和 xpath 来查找页面上的任何元素。

在您的情况下,由于您有嵌套的<ul>列表,最好使用 xpath 进行导航:

# find every <li> in the <ul> under div with class div_class
raw_html = raw_string.xpath("//div[@class='div_class']/ul/li")
for item in raw_html:
    print(item.text.strip())

打印:

I'm a title. Parse me
I'm a title. Parse me
I'm a title. Parse me
I'm a title. Parse me

以下是对lxml中xpath的简要解释:http://lxml.de/tutorial.html#using-xpath-to-find-text

1
区别在于.text(单个元素)和.text_content()(递归)否则cssselect("div.div_class > ul > li")也可能起作用。 - jfs
是的,我也这么想。但是使用css-select会找到所有的<li>,甚至是内部的,这不是所需的。 - Vladimir Sinenko
@Vladimir:请注意,我在两个地方使用了>(与问题中的表达式不同)。 - jfs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接