【问题标题】:BeautifulSoup soup.find not returning valuesBeautifulSoup soup.find 没有返回值
【发布时间】:2018-05-23 23:07:20
【问题描述】:

我正在尝试为一些配置文件抓取一组页面,并且我构建了一个抓取器,它从一个 csv 文件中迭代一个 url 列表(例如:https://myurl.com)并将它们输入到美丽的灵魂中。然而,soup.find 不返回任何值,尽管只给出一个 URL 时工作。

例如这个 sn-p 工作:

page = requests.get('www.myurl.org')
soup = BeautifulSoup(page.text, 'html.parser')

name = soup.title.string
specialty = soup.find('p', attrs={'id':"content_element_0_main_column_0_ctl09_Spec"})
birthdate = soup.find('p', attrs={'id' : "content_element_0_main_column_0_ctl17_Birth"})
gender = soup.find('p', attrs={'id':"content_element_0_main_column_0_ctl17_Gender"})
email = soup.find('p', attrs={'id':"content_element_0_main_column_0_ctl09_Web"})

f.writerow([name, specialty, birthdate, gender, email])

但是,这只会返回 csv 中的“名称”字段,而不会返回后续字段:

with open('linklistshort.csv') as inf:
    urls = (line.strip() for line in inf)
    for url in urls:
        print(url)
        site = urlopen(url).read()
        soup = BeautifulSoup(site, 'html.parser')
        name = soup.title.string
        specialty = soup.find('p', attrs={'id' :"content_element_0_main_column_0_ctl09_Spec"})
        birthdate = soup.find('p', attrs={'id' : "content_element_0_main_column_0_ctl17_Birth"})
        gender = soup.find('p', attrs={'id':"content_element_0_main_column_0_ctl17_Gender"})
        email = soup.find('p', attrs={'id':"content_element_0_main_column_0_ctl09_Web"})
        f.writerow([name, specialty, birthdate, gender, email])

结果应该是一个包含五列的 csv 文件,每列都包含正确的数据 - 这是我从第一个代码块中得到的,用于输入的单个 url。

但是,实际输出返回五列,第一列填充“名称”字段,其他为空白。显然,遍历 URL 是有效的,因为每个 URL 都会返回名称。 beautifulSoup 命令的唯一区别是我在第一个也是唯一一个站点中有 page.text,但是 site.text 破坏了循环功能并且不返回任何输出。

我是一个完全的 Python 初学者,但我已经通过解码命令等解决了这个问题,并且每次如果我更改任何内容,循环都会失败。

【问题讨论】:

  • 能否给我们您要解析的第二和第三个网址?
  • 为了能够提供帮助,我们确实需要查看您尝试抓取的实际 URL。这样我们就可以看到返回的 HTML 并提出修复建议。

标签: python csv beautifulsoup


【解决方案1】:

您在 csv writerow 函数中传递 BeautifulSoup 对象,请将所有汤对象更改为如下文本:

page = requests.get('www.myurl.org')
soup = BeautifulSoup(page.text, 'html.parser')

name = soup.title.string
specialty = soup.find('p', attrs={'id':"content_element_0_main_column_0_ctl09_Spec"}).text
birthdate = soup.find('p', attrs={'id' : "content_element_0_main_column_0_ctl17_Birth"}).text
gender = soup.find('p', attrs={'id':"content_element_0_main_column_0_ctl17_Gender"}).text
email = soup.find('p', attrs={'id':"content_element_0_main_column_0_ctl09_Web"}).text

f.writerow([name, specialty, birthdate, gender, email])

【讨论】:

    猜你喜欢
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    相关资源
    最近更新 更多