从bs4导入美丽的汤
html_content = """<div id="formContents" class="dformDisplay ">
<div class="sectionDiv expanded">
<table id="sect_s1" class="formSection LabelsAbove">
<tr class="formRow ">
<td id="tdl_8" class="label lc" >
<label class="fieldLabel " ><b >Address</b></label>
<table class="EmailFieldPadder" border="0" cellspacing="0" cellpadding="0" valign="top" style="width:98%;margin-top:.3em;margin-right:1.5em;">
<tr><td class="EmailDivWrapper" style="background-color:#f5f5f5;padding: 0.83em;border-radius:3px;margin:0;border:0px;">
<div id="tdf_8" class="cell cc" >
<a
href="https://maps.google.com/?q=1183+Pelham+Wood+Dr%2C+Rock+Hill%2C+SC+29732">1183
Pelham Wood Dr, Rock Hill, SC 29732</a>
</span></div>
</td></tr></table>
</td>
"""
try:
soup = BeautifulSoup(html_content, 'html.parser')
form_data = soup.find("div",{"id":"formContents"})
if form_data:
section_data = soup.findAll("div",{"class":"sectionDiv expanded"})
for datas in section_data:
labels = datas.findAll("label",{"class":"fieldLabel"})
for item in labels:
labels = item.text
print(labels)
entity_data = item.findAll("td").text
print(entity_data)
except Exception as e:
print(e)
我要求的输出:
Address : 183 Pelham Wood Dr, Rock Hill, SC 29732.
是否有任何解决方案,以获得特定的输出使用beautifulsoup
。我需要的地址,特定的HTML源内容。
3条答案
按热度按时间euoag5mw1#
findAll()
,而是将find_all()
或select()
与css selectors
一起使用-有关详细信息,请花一分钟查看文档 *您可以选择元素中包含
<label>
的所有<td>
,然后使用stripped_strings
提取内容-如果它与How to scrape data from the website which is not aligned properly中的动机相同,则可以获得结构良好的标签和文本dict
示例
输出
icnyk63a2#
您可以搜索
a
标签,其中href
以https://maps.google.com
开头:这里重要的不是所使用的
soup
对象,而是使用regexp从标记中提取地址文本的策略。d7v8vwbk3#
当我尝试你的代码时,它会打印
您应该注意第二行,因为 *
item.findAll("td").text
* 总是会引发错误;您可以改为执行类似'\n'.join([td.text for td in item.findAll("td")])
的操作,这不会引发任何错误。但是,它只会返回一个空字符串[因为
item.findAll("td")
是一个空的ResultSet
],因为使用 *for item in labels....item.findAll("td")...
*,您要查找的是label
标记 * 内部 * 的td
标记,而实际上它们位于标签旁边的table
标记中。溶液1:使用
.find_next_siblings
[Like这一点,您也不需要
try...except
。][对我来说]那印着
溶液2:将
.select
与CSS selectors配合使用这应该可以打印出来
顺便说一句,*
dict(zip(labels, entity_data))
* 会返回{'Address': '1183 Pelham Wood Dr, Rock Hill, SC 29732'}
,我使用了' '.join(td.get_text(' ').split())
而不仅仅是td.text
(labels
中的l
也是如此)来最小化空格,并在一行中获得所有内容。td
标签的相邻表的任何标签);并且第一种解决方案存在如果标签丢失其之后的表则从下一标签获取表的风险。