该网站有多个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(..)函数?
答案 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>]
>>>
另一种替代方法,你可以尝试找到所有的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