Python 使用beautifulsoup访问未标记的文本

Python 使用beautifulsoup访问未标记的文本,python,beautifulsoup,bs4,Python,Beautifulsoup,Bs4,我正在使用python和beautifulsoup4提取一些地址信息。 更具体地说,我在检索非美国邮政编码时需要帮助 考虑一家美国公司的以下html数据:(已经是一个soup对象) 你可以看到我需要一些律师,如果地址['zip']='': 这两个对象示例给我带来了麻烦。在下面的示例中,我想检索EC4N 4SA <div class="compContent curvedBottom" id="companyDescription"> <div class="vcard clea

我正在使用python和beautifulsoup4提取一些地址信息。 更具体地说,我在检索非美国邮政编码时需要帮助

考虑一家美国公司的以下html数据:(已经是一个soup对象)

你可以看到我需要一些律师,如果地址['zip']='':

这两个对象示例给我带来了麻烦。在下面的示例中,我想检索EC4N 4SA

<div class="compContent curvedBottom" id="companyDescription">
<div class="vcard clearfix">
<p id="adr">
<span class="street-address">Albert Buildings</span><br/>
<span class="extended-address">00 Queen Victoria Street</span>
<span class="locality">London</span>
                                    EC4N 4SA
                                    <span class="region">London</span>
<br/><span class="country-name">England</span>
</p>
<p>
</p>
<p class="companyURL"><a class="url ext" href="http://www.website.com.com" target="_blank">http://www.website.com.com</a></p>
</div>
<p><strong>Line of Business</strong> <br/>Management services, nsk</p> 
</div>

阿尔伯特大厦
维多利亚皇后街00号 伦敦 ec4n4sa 伦敦
英国

业务线
管理服务,nsk

以及下面,我对获得71364感兴趣

<div class="compContent curvedBottom" id="companyDescription">
<div class="vcard clearfix">
<p id="adr">
<span class="street-address">Alfred-Kärcher-Str. 100</span><br/>
                                                71364
                                    <span class="locality">Winnenden</span>
<span class="region">Baden-Württemberg</span>
<br/><span class="country-name">Germany</span>
</p>
<p>
<span class="tel">
<strong class="type">Phone: </strong>+00-1234567
                            </span><br/>
<span class="tel"><strong class="type">Fax: </strong>+00-1234567</span>
</p>
</div>
</div>

阿尔弗雷德·卡彻街100号
71364 温内登 巴登-沃尔滕堡
德国

电话:+00-1234567
传真:+00-1234567

现在,我在大约68000个账户上运行这个程序,其中28000个非美国账户。我只举了两个例子,我知道目前的方法不是防弹的。可能还有其他的地址格式,这个脚本并没有像预期的那样工作,但我相信弄清楚英国和德国的帐户将非常有帮助


提前感谢您,因为它是唯一一个没有标签的文本,所以您可以使用

find_all(text=True, recursive=False) 
仅获取文本(无标记),而不从嵌套标记(
)获取文本。这将为列表提供文本和一些
\n
和空格,以便您可以使用
join()
创建一个字符串,并使用
strip()
删除所有
\n
和空格

data = '''<p id="adr">
<span class="street-address">Albert Buildings</span><br/>
<span class="extended-address">00 Queen Victoria Street</span>
<span class="locality">London</span>
                                    EC4N 4SA
                                    <span class="region">London</span>
<br/><span class="country-name">England</span>
</p>'''

from bs4 import BeautifulSoup as BS

soup = BS(data, 'html.parser').find('p')

print(''.join(soup.find_all(text=True, recursive=False)).strip())

结果:
71364

这真漂亮!谢谢你@furas,我会马上尝试一下。我在看这个时没有注意到包含的标记。
find_all(text=True, recursive=False) 
data = '''<p id="adr">
<span class="street-address">Albert Buildings</span><br/>
<span class="extended-address">00 Queen Victoria Street</span>
<span class="locality">London</span>
                                    EC4N 4SA
                                    <span class="region">London</span>
<br/><span class="country-name">England</span>
</p>'''

from bs4 import BeautifulSoup as BS

soup = BS(data, 'html.parser').find('p')

print(''.join(soup.find_all(text=True, recursive=False)).strip())
data = '''<p id="adr">
<span class="street-address">Alfred-Kärcher-Str. 100</span><br/>
                                                71364
                                    <span class="locality">Winnenden</span>
<span class="region">Baden-Württemberg</span>
<br/><span class="country-name">Germany</span>
</p>'''

from bs4 import BeautifulSoup as BS

soup = BS(data, 'html.parser').find('p')

print(''.join(soup.find_all(text=True, recursive=False)).strip())