提取 <div> 标签外的文本 BeautifulSoup
Extracting text outside of a <div> tag BeautifulSoup
所以我在练习抓取,我遇到了这样的事情:
<div class="profileDetail">
<div class="profileLabel">Mobile : </div>
021 427 399
</div>
我需要 <div>
标签之外的数字:
我的代码是:
num = soup.find("div",{"class":"profileLabel"}).text
但它的输出是 Mobile :
只是 <div>
标签内的文本而不是标签外的文本。
那么我们如何提取 <div>
标签之外的文本呢?
尝试使用 soup.find("div",{"class":"profileLabel"}).next_sibling
,这将获取下一个元素,它可以是 bs4.Tag
或 bs4.NavigableString
。
bs4.NavigableString
是您在这种情况下想要得到的。
elem = soup.find("div",{"class":"profileLabel"}).next_sibling
print type(elem)
# Should return
bs4.element.NavigableString
示例:
In [4]: s = bs4.BeautifulSoup('<div> Hello </div>HiThere<p>next_items</p>', 'html5lib')
In [5]: s
Out[5]: <html><head></head><body><div> Hello </div>HiThere<p>next_items</p></body></html>
In [6]: s.div
Out[6]: <div> Hello </div>
In [7]: s.div.next_sibling
Out[7]: u'HiThere'
In [8]: type(s.div.next_sibling)
Out[8]: bs4.element.NavigableString
我会创建一个 可重用函数 以通过标签获取值,通过 text
查找标签并获取 next sibling:
import re
def find_by_label(soup, label):
return soup.find("div", text=re.compile(label)).next_sibling
用法:
find_by_label(soup, "Mobile").strip() # prints "021 427 399"
对于觉得这不是他们想要的未来读者,这可能是您的答案:
for tags in soup.find_all('div'):
if "profileLabel" in tags['class']:
print(tags.contents[0])
所以我在练习抓取,我遇到了这样的事情:
<div class="profileDetail">
<div class="profileLabel">Mobile : </div>
021 427 399
</div>
我需要 <div>
标签之外的数字:
我的代码是:
num = soup.find("div",{"class":"profileLabel"}).text
但它的输出是 Mobile :
只是 <div>
标签内的文本而不是标签外的文本。
那么我们如何提取 <div>
标签之外的文本呢?
尝试使用 soup.find("div",{"class":"profileLabel"}).next_sibling
,这将获取下一个元素,它可以是 bs4.Tag
或 bs4.NavigableString
。
bs4.NavigableString
是您在这种情况下想要得到的。
elem = soup.find("div",{"class":"profileLabel"}).next_sibling
print type(elem)
# Should return
bs4.element.NavigableString
示例:
In [4]: s = bs4.BeautifulSoup('<div> Hello </div>HiThere<p>next_items</p>', 'html5lib')
In [5]: s
Out[5]: <html><head></head><body><div> Hello </div>HiThere<p>next_items</p></body></html>
In [6]: s.div
Out[6]: <div> Hello </div>
In [7]: s.div.next_sibling
Out[7]: u'HiThere'
In [8]: type(s.div.next_sibling)
Out[8]: bs4.element.NavigableString
我会创建一个 可重用函数 以通过标签获取值,通过 text
查找标签并获取 next sibling:
import re
def find_by_label(soup, label):
return soup.find("div", text=re.compile(label)).next_sibling
用法:
find_by_label(soup, "Mobile").strip() # prints "021 427 399"
对于觉得这不是他们想要的未来读者,这可能是您的答案:
for tags in soup.find_all('div'):
if "profileLabel" in tags['class']:
print(tags.contents[0])