如何从BeautifulSoup

时间:2017-06-10 14:21:46

标签: python html web-scraping beautifulsoup

该网站有多个P标签,但我只是想刮掉其中一个标签。网站检查如下:

<div class="sidebar sbt">
 <h4>history</h4>
   <p class="top">
        <strong>First </strong><br>
              Jun 2017
   </p>
   <p class="top">
        <strong>Page </strong><br>
        Last 30 days: <strong>200</strong>        
   </p>
   <p class="top">
        <strong>Last </strong><br>
        2019
    </p>
        </div>

如上所述,有很多P标签,如果我想抓住其中一个,例如2017年6月1日,我将如何使用soup.findAll(..)函数?

4 个答案:

答案 0 :(得分:0)

您可以使用N并在获得所有.getText()代码后与所需文字进行比较。

答案 1 :(得分:0)

键入soup.p,这将为您提供给定HTML数据的第一个结果。

>>> from bs4 import BeautifulSoup
>>> htmlData = '''
... <div class="sidebar sbt">
...  <h4>history</h4>
...    <p class="top">
...         <strong>First </strong><br>
...               Jun 2017
...    </p>
...    <p class="top">
...         <strong>Page </strong><br>
...         Last 30 days: <strong>200</strong>        
...    </p>
...    <p class="top">
...         <strong>Last </strong><br>
...         2019
...     </p>
...         </div>
... '''
>>>
>>> soup = BeautifulSoup(htmlData, 'html.parser')
>>> soup.p
<p class="top">
<strong>First </strong><br>
              Jun 2017
   </br></p>
>>> 

如果我们想抓第n个数据那么

soup.select("p:nth-of-type(n)")

示例:

>>> soup.select("p:nth-of-type(3)")
[<p class="top">
<strong>Last </strong><br>
        2019
    </br></p>]
>>> soup.select("p:nth-of-type(2)")
[<p class="top">
<strong>Page </strong><br>
        Last 30 days: <strong>200</strong>
</br></p>]
>>> soup.select("p:nth-of-type(1)")
[<p class="top">
<strong>First </strong><br>
              Jun 2017
   </br></p>]
>>>

More about CSS selectors

另一种替代方法,你可以尝试找到所有的p标签,然后迭代它以找到所需的标签。

答案 2 :(得分:0)

您似乎希望根据文字定位p元素。这是一种方法。

最重要的一行是使用正则表达式查找“​​过去30天”的行,它只是p元素中字符串的一部分。找到此字符串后,您可以找到其父项,然后显示该父项的完整text或父项的其他块。

请注意,由于我使用了find_all,结果是一个列表(因为可能有多个项目)。我需要选择第一个元素零。

>>> import bs4
>>> HTML = open('temp.htm').read()
>>> for line in HTML.split('\n'):
...     print (line)
...     
<div class="sidebar sbt">
 <h4>history</h4>
   <p class="top">
        <strong>First </strong><br>
              Jun 2017
   </p>
   <p class="top">
        <strong>Page </strong><br>
        Last 30 days: <strong>200</strong>        
   </p>
   <p class="top">
        <strong>Last </strong><br>
        2019
    </p>
        </div>
>>> soup = bs4.BeautifulSoup(HTML, 'lxml')
>>> target = soup.find_all(string=re.compile('Last 30 days'))
>>> target
['\n        Last 30 days: ']
>>> target[0].findParent()
<p class="top">
<strong>Page </strong><br/>
        Last 30 days: <strong>200</strong>
</p>
>>> target[0].findParent().text
'\nPage \n        Last 30 days: 200\n'

答案 3 :(得分:0)

您可以尝试。我在这里使用soup.findAll(..)函数:

from bs4 import BeautifulSoup
import json
import requests
html_doc="""
<div class="sidebar sbt">
 <h4>history</h4>
   <p class="top">
        <strong>First </strong><br>
              Jun 2017
   </p>
   <p class="top">
        <strong>Page </strong><br>
        Last 30 days: <strong>200</strong>        
   </p>
   <p class="top">
        <strong>Last </strong><br>
        2019
    </p>
        </div>
"""
soup = BeautifulSoup(html_doc, 'lxml')
result = soup.findAll('p')[0].text
print(" ".join(result.split()))

输出将是:

First Jun 2017