使用beautifulsoup提取属性值


111

我试图在网页上的特定“输入”标签中提取单个“值”属性的内容。我使用以下代码:

import urllib
f = urllib.urlopen("http://58.68.130.147")
s = f.read()
f.close()

from BeautifulSoup import BeautifulStoneSoup
soup = BeautifulStoneSoup(s)

inputTag = soup.findAll(attrs={"name" : "stainfo"})

output = inputTag['value']

print str(output)

我收到TypeError:列表索引必须是整数,而不是str

即使从Beautifulsoup文档中我了解到字符串在这里也不应该成为问题...但是我没有专家,我可能会误解了。

任何建议,不胜感激!提前致谢。

Answers:


150

.find_all() 返回所有找到的元素的列表,因此:

input_tag = soup.find_all(attrs={"name" : "stainfo"})

input_tag是一个列表(可能仅包含一个元素)。根据您的确切要求,您应该执行以下任一操作:

 output = input_tag[0]['value']

或使用.find()仅返回一个(第一个)找到的元素的方法:

 input_tag = soup.find(attrs={"name": "stainfo"})
 output = input_tag['value']

好东西!谢谢。现在我有一个关于解析一堆非ASCII字符的输出的问题,但是我将在一个单独的问题中提出。
Barnabe

3
不应按照stackoverflow.com/questions/2616659/…访问“值” 。是什么让上述代码在这种情况下起作用?我认为您将必须通过这样做来获取价值output = inputTag[0].contents
Seth,2010年

@Seth-否,因为他正在寻找input-tag的属性“值”,.contents返回由标签封装的文本(<span>我是.contents </ span>)-(现在只是回复,因为我有(仔细检查发生了什么;认为其他人可能会受益)
Dolan Antenucci

1
好答案。但是,如果标记作为无值属性,我会使用inputTag[0].get('value') 而不是inputTag[0]['value']防止无指针
两栖游戏,2016年

不直接链接到访问网站首页的链接该如何处理,如何获取所有直接或间接链接到网页的链接。
Rink16

26

在中Python 3.x,只需get(attr_name)在您使用的标签对象上使用find_all

xmlData = None

with open('conf//test1.xml', 'r') as xmlFile:
    xmlData = xmlFile.read()

xmlDecoded = xmlData

xmlSoup = BeautifulSoup(xmlData, 'html.parser')

repElemList = xmlSoup.find_all('repeatingelement')

for repElem in repElemList:
    print("Processing repElem...")
    repElemID = repElem.get('id')
    repElemName = repElem.get('name')

    print("Attribute id = %s" % repElemID)
    print("Attribute name = %s" % repElemName)

针对如下的XML文件conf//test1.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <singleElement>
        <subElementX>XYZ</subElementX>
    </singleElement>
    <repeatingElement id="11" name="Joe"/>
    <repeatingElement id="12" name="Mary"/>
</root>

印刷品:

Processing repElem...
Attribute id = 11
Attribute name = Joe
Processing repElem...
Attribute id = 12
Attribute name = Mary

如果我按照PEP 8进行编辑并使用更现代的字符串格式设置方法,您介意吗?
AMC

很好,继续吧
两栖动物

6

如果要从上面的源中检索属性的多个值,可以使用findAll和列表推导来获取所需的一切:

import urllib
f = urllib.urlopen("http://58.68.130.147")
s = f.read()
f.close()

from BeautifulSoup import BeautifulStoneSoup
soup = BeautifulStoneSoup(s)

inputTags = soup.findAll(attrs={"name" : "stainfo"})
### You may be able to do findAll("input", attrs={"name" : "stainfo"})

output = [x["stainfo"] for x in inputTags]

print output
### This will print a list of the values.

4

我实际上建议您使用一种节省时间的方法,假设您知道哪种标签具有这些属性。

假设标签xyz的attritube名为“ staininfo”。

full_tag = soup.findAll("xyz")

而且我不希望您知道full_tag是一个列表

for each_tag in full_tag:
    staininfo_attrb_value = each_tag["staininfo"]
    print staininfo_attrb_value

因此,您可以获得所有标签xyz的staininfo的所有attrb值


3

您也可以使用:

import requests
from bs4 import BeautifulSoup
import csv

url = "http://58.68.130.147/"
r = requests.get(url)
data = r.text

soup = BeautifulSoup(data, "html.parser")
get_details = soup.find_all("input", attrs={"name":"stainfo"})

for val in get_details:
    get_val = val["value"]
    print(get_val)

这与已经存在的更老的答案有何不同?
AMC

0

我在Beautifulsoup 4.8.1中使用它来获取某些元素的所有类属性的值:

from bs4 import BeautifulSoup

html = "<td class='val1'/><td col='1'/><td class='val2' />"

bsoup = BeautifulSoup(html, 'html.parser')

for td in bsoup.find_all('td'):
    if td.has_attr('class'):
        print(td['class'][0])

重要的是要注意,即使属性只有一个值,属性键也会检索列表。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.