使用BeautifulSoup查找特定标签

时间:2016-06-27 15:24:24

标签: python html beautifulsoup html-parsing

以下是我正在解析的网站:http://uniapple.net/usaddress/address.php?address1=501+10th+ave&address2=&city=nyc&state=ny&zipcode=10036&country=US

我希望能够找到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))

3 个答案:

答案 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