【问题标题】:I can't get a value of HTML tag using beautifulsoup python我无法使用 beautifulsoup python 获取 HTML 标签的值
【发布时间】:2021-09-12 05:30:00
【问题描述】:

嘿,我正在尝试抓取一个网站,并且输入中的某些值不会抓取为文本 仅 HTML 像这样

<input class="aspNetDisabled" disabled="disabled" id="ContentPlaceHolder1_EmpName" name="ctl00$ContentPlaceHolder1$EmpName" style="color:#003366;background-color:#CCCCCC;font-weight:bold;height:27px;width:150px;" type="text" value="John Doe"/>

所以我想做的只是获得价值(John Doe) 我试图 put.text 但它没有刮掉它 这是代码

soup=BeautifulSoup(r.content,'lxml')
    for name in soup.findAll('input', {'name':'ctl00$ContentPlaceHolder1$EmpName'}):
            with io.open('x.txt', 'w', encoding="utf-8") as f:
                f.write (name.prettify())

【问题讨论】:

  • 首先尝试在控制台中打印name.prettify() 并验证这是否是您期望的值。这将帮助您调试问题。
  • 当我打印 name.prettify() 时,我得到的代码是上面的 HTML

标签: python web beautifulsoup screen-scraping


【解决方案1】:

调用.text 时没有得到结果的原因是因为“John Doe”不在 HTML 的文本中,它是一个 HTML 属性value="John Doe"

您可以使用tag[&lt;attribute&gt;] 像Python 字典(dict) 一样访问该属性。 (见BeautifulSoup documentation on attributes)。

html = """<input class="aspNetDisabled" disabled="disabled" id="ContentPlaceHolder1_EmpName" name="ctl00$ContentPlaceHolder1$EmpName" style="color:#003366;background-color:#CCCCCC;font-weight:bold;height:27px;width:150px;" type="text" value="John Doe"/>"""

soup = BeautifulSoup(html, "lxml")
for name in soup.findAll("input", {"name": "ctl00$ContentPlaceHolder1$EmpName"}):
    print(name["value"])

输出:

John Doe

【讨论】:

  • 天哪,伙计。谢谢
【解决方案2】:

虽然MendelG 的答案效果很好,但如果不使用for 循环,它可能会更简洁一些(如果你只想提取一个元素):

>>> soup.find('input')['value']
# John Doe

代码:

from bs4 import BeautifulSoup

string = '''
<input class="aspNetDisabled" disabled="disabled" id="ContentPlaceHolder1_EmpName" name="ctl00$ContentPlaceHolder1$EmpName" style="color:#003366;background-color:#CCCCCC;font-weight:bold;height:27px;width:150px;" type="text" value="John Doe"/>
'''

soup = BeautifulSoup(string, 'html.parser')

john_come_here = soup.find('input')['value']
print(john_come_here)

# John Doe

【讨论】:

  • 谢谢,但是你知道我怎样才能让它打印所有的结果,而不仅仅是第一个结果吗?
  • 因为当我添加 FindAll 而不是 find 它说 TypeError: list indices must be integers or slices, not str
  • @Saleh07BR 当然!为了更好地理解上下文,您能否提供 URL?
  • 我解决了你能检查我的其他问题吗?