Python库做类似jQuery的文本抽取?

2024-05-29 02:42:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含如下条目的html:

<div class="entry">
  <h3 class="foo">
    <a href="http://www.example.com/blog-entry-slug"
    rel="bookmark">Blog Entry</a>
  </h3>
  ...
</div>

我想提取文本“Blog Entry”(和其他一些属性,所以我正在寻找一个通用的答案)。

在jQuery中,我愿意

$('.entry a[rel=bookmark]').text()

我在Python中所能得到的最接近的信息是:

from BeautifulSoup import BeautifulSoup
import soupselect as soup

rawsoup = BeautifulSoup(open('fname.html').read())

for entry in rawsoup.findAll('div', 'entry'):
    print soup.select(entry, 'a[rel=bookmark]')[0].string.strip()

http://code.google.com/p/soupselect/中选择灵魂。

Soupselect不理解完整的CSS3选择器语法,就像jQuery一样。Python里有这样的野兽吗?


Tags: importdivcomhttphtmlblogjqueryh3
3条回答

您可能还想看看pyquery。pyquery是一个类似jquery的python库。 找到它here

您可能想看看lxmlCSSSelector类,该类尝试实现w3c规范中描述的CSS选择器。另外,出于性能和其他原因,manyfolksrecommendlxml用于在BeautifulSoup上解析HTML/XML。

我认为lxml的CSSSelector使用XPath进行元素选择,但是您可能需要自己检查文档。下面是使用lxml的示例:

>>> from lxml.cssselect import CSSSelector
>>> from lxml.html import fromstring
>>> html = '<div class="entry"><h3 class="foo"><a href="http://www.example.com/blog-entry-slug" rel="bookmark">Blog Entry</a></h3></div>'
>>> h = fromstring(html)
>>> sel = CSSSelector("a[rel=bookmark]")
>>> [e.text for e in sel(h)]
['Blog Entry']

使用关键字参数非常容易。

>>> from BeautifulSoup import BeautifulSoup
>>> soup = BeautifulSoup('''<div class="entry">
...   <h3 class="foo">
...     <a href="http://www.example.com/blog-entry-slug"
...     rel="bookmark">Blog Entry</a>
...   </h3>
...   ...
... </div>
... ''')
>>> soup.find('div', 'entry').find(rel='bookmark').text
u'Blog Entry'

或者

>>> for entry in soup('div', 'entry'):
...     for bookmark in entry(rel='bookmark'):
...         print bookmark.text
...
Blog Entry

您还可以使用attrs来影响.entry的选择器,而不是div.entry

>>> for entry in soup(attrs={'class': 'entry'}):
...     for bookmark in entry(rel='bookmark'):
...         print bookmark.text
...
Blog Entry

(注意调用汤或汤的一部分相当于.findAll()。)

作为列表理解,这是[b.text for e in soup('div', 'entry') for b in e(rel='bookmark')](产生[u'Blog Entry'])。

如果你想要真正的CSS3选择器,我不知道有任何这样的东西美化组。所有(或者如果不是全部,几乎全部)都可以通过简单的嵌套、条件和正则表达式来完成(您也可以使用entry(rel=re.compile('^bookmark$')))。如果你想要这样的东西,考虑下一个项目吧!它可能有助于扁平化代码,使其更易于网络用户理解。

相关问题 更多 >

    热门问题