我希望能够找到td标签之间第39行的单词。该行告诉我地址是住宅还是商业,这是我的脚本所需要的。
这是我的所得,但我收到了这个错误:
AttributeError: 'NoneType' object has no attribute 'find_next'
我使用的代码是:
from bs4 import BeautifulSoup
import urllib
page = "http://uniapple.net/usaddress/address.php?address1=501+10th+ave&address2=&city=nyc&state=ny&zipcode=10036&country=US"
z = urllib.urlopen(page).read()
thesoup = BeautifulSoup(z, "html.parser")
comres = (thesoup.find("th",text=" Residential or ").find_next("td").text)
print(str(comres))
答案 0 :(得分:1)
你所缺少的只是一些家务管理:
ths = thesoup.find_all("th")
for th in ths:
if 'Residential or' in th.text:
comres = th.find_next("td").text
print(str(comres))
>> Commercial
答案 1 :(得分:1)
text
参数不起作用。这与如何计算元素的.string
property有关。相反,我会使用search function来实际调用get_text()
并检查完整的"文本"包含子节点的元素:
label = thesoup.find(lambda tag: tag and tag.name == "th" and \
"Residential" in tag.get_text())
comres = label.find_next("td").get_text()
print(str(comres))
打印Commercial
。
我们可以更进一步,并使可重用函数通过标签获取值:
soup = BeautifulSoup(z, "html.parser")
def get_value_by_label(soup, label):
label = soup.find(lambda tag: tag and tag.name == "th" and label in tag.get_text())
return label.find_next("td").get_text(strip=True)
print(get_value_by_label(soup, "Residential"))
print(get_value_by_label(soup, "City"))
打印:
Commercial
NYC
答案 2 :(得分:-1)
您需要使用正则表达式作为文本字段,例如re.compile('Residential or')
,而不是字符串。
这对我有用。我不得不迭代所提供的结果,但如果您只希望每页只有一个结果,则可以find
替换find_all
:
for r in thesoup.find_all(text=re.compile('Residential or')):
r.find_next('td').text