1

我有以下给定的html结构

<li class="g">
 <div class="vsc">    
  <div class="alpha"></div>
  <div class="beta"></div>
  <h3 class="r">
   <a href="http://www.stackoverflow.com"></a>
  </h3>
 </div>
</li> 

上面的 html 结构不断重复,使用BeautifulSoupPython从上面的 html 结构中解析所有链接(stackoverflow.com)的最简单方法是什么?

4

2 回答 2

2

BeautifulSoup 4使用 CSS 选择器提供了一种方便的方法来实现这一点:

from bs4 import BeautifulSoup
soup = BeautifulSoup(html)
print [a["href"] for a in soup.select('h3.r a')]

这还具有通过上下文限制选择的优点:它仅选择那些是具有类 r 的 h3 节点的子节点的锚节点。

只需调整选择器即可轻松省略约束或选择最适合需要的约束;请参阅CSS 选择器文档

于 2012-11-02T08:56:40.517 回答
1

使用 Petri 提出的 CSS 选择器可能是使用 BS 的最佳方式。但是,我不能阻止自己推荐使用lxml.htmland xpath,它非常适合这项工作。

测试html

html="""
<html>
<li class="g">
<div class="vsc"></div>    
<div class="alpha"></div>
<div class="beta"></div>
<h3 class="r">
<a href="http://www.correct.com"></a>
</h3>
</li>
<li class="g">
<div class="vsc"></div>    
<div class="alpha"></div>
<div class="beta"></div>
<h3 class="r">
<a href="http://www.correct.com"></a>
</h3>
</li>
<li class="g">
<div class="vsc"></div>    
<div class="gamma"></div>
<div class="beta"></div>
<h3 class="r">
<a href="http://www.incorrect.com"></a>
</h3>
</li>
</html>"""

它基本上是一个单线:

    import lxml.html as lh
    doc=lh.fromstring(html)
    doc.xpath('.//li[@class="g"][div/@class = "vsc"][div/@class = "alpha"][div/@class = "beta"][h3/@class = "r"]/h3/a/@href')

    Out[264]:
    ['http://www.correct.com', 'http://www.correct.com']
于 2012-11-02T08:21:48.037 回答