首页 > 解决方案 > 从标签内部获取信息 - BeautifulSoup4 (Python 3)

问题描述

我的代码目前正在从网页中的表格中提取信息,但它只返回标签之间的值。有人可以帮我从该代码产生的标签中获取电子邮件和名称吗?

emails = []
membership_url = 'http://url/members?letter=a'
print(membership_url)
member_page = s.get(membership_url)
soup = BeautifulSoup(member_page.content, 'html5lib')
members = soup.findAll("table")[4]
tds = members.findAll("td")
print(tds)

样品输出:

<td><a href="../../options/johndoe--at--gmail.com">johndoe@gmail.com</a><br/><input name="johndoe%40gmail.com_realname" size="24" type="TEXT" value="John Doe"/><input name="user" type="HIDDEN" value="johndoe%40gmail.com"/></td>

我对 bs4 或 HTML 了解不多,所以很幸运我能走到这一步。理想情况下,我想同时提取 johndoe@gmail.com 和真名“John Doe”。我现在能得到的只是标签之间的电子邮件。

标签: pythonweb-scrapingbeautifulsoup

解决方案


在没有看到 html 的其余部分的情况下,bs4 4.7.1 + 可能会查找两个相邻input的标签,其中相邻的标签name具有 value 的属性user。您的里程可能会因完整的 html 而异。+ 是相邻的兄弟组合子。

from bs4 import BeautifulSoup as bs
import requests
import urllib.parse

s = '<td><a href="../../options/johndoe--at--gmail.com">johndoe@gmail.com</a><br/><input name="johndoe%40gmail.com_realname" size="24" type="TEXT" value="John Doe"/><input name="user" type="HIDDEN" value="johndoe%40gmail.com"/></td>'
soup = bs(s)
node = soup.select_one('input:has(+input[name=user])')
print(node['value'], ' ' ,urllib.parse.unquote(node['name']))

推荐阅读