来自NewsArticle的新手python beautifulSoup提取文章

时间:2015-04-08 19:22:32

标签: python beautifulsoup

我有以下XML部分:

<section class="article-body">
         <!-- <EdIndex> -->
         <div class="squared-inline-picture-offset no-mobile">
          <picture class="lazy square pull-left">
           <img height="" width="" alt="" src="" class="loaded">
           <noscript><img src="" width="" height="" alt="" /></noscript>
          </picture>
         </div>    
         <p>bla1 bla1 bla1</p>
         <p>bla2 bla2 bla2</p>
         <p>bla3 bla3 bla3</p>
         <!-- </EdIndex> -->
         <div class="adv no-mobile">
         </div>
   </section>

我需要提取&#34; bla bla bla&#34;部分。 我试过

 soup = BeautifulSoup(data)
  [...] 
 soup.findAll('section',{"class" : "article-body"})

结果不好:(

任何提示? 有没有快速的方法从http://schema.org/NewsArticle使用python和BeautifulSoup获取文章正文?

1 个答案:

答案 0 :(得分:0)

当你说(&#39; section&#39;,{&#34; class&#34;:&#34; article-body&#34;})时,你要求的是身体类。这意味着它会给你带来好处......一切都回来......

您要做的是指定其中的项目。在这种情况下,您可以直接前往&#39; p&#39; 像这样。

>>> soup = BeautifulSoup(data)
>>> p = soup.findAll('p')
>>> print(p)
[<p>bla1 bla1 bla1</p>, <p>bla2 bla2 bla2</p>, <p>bla3 bla3 bla3</p>]
>>> print(p[1].text)
bla2 bla2 bla2

注意:你只能将.text放在列表项上,而不是列在自己的列表上。

您是否看到,它会找到所有p元素然后为您找到它找到的每个元素的列表。这将选择所有p元素,所以如果我想特别选择这个,你可以这样做:

soup = BeautifulSoup(data)
result = soup.find('section', {'class': 'article-body'})
results = result.findAll('p')
for p in results:
    print(p, p.text)

输出:

<p>bla1 bla1 bla1</p> bla1 bla1 bla1
<p>bla2 bla2 bla2</p> bla2 bla2 bla2
<p>bla3 bla3 bla3</p> bla3 bla3 bla3

因此,要获取带有标题的元素的原始文本,您需要再次使用它。请记住,find all为您提供了一个列表,find为您提供了它所依赖的第一个元素。

编辑:修复了一些复制粘贴错误。