Beautifulsoup得到('价值')

时间:2017-12-20 19:30:45

标签: python beautifulsoup

<ul class="mainview">
    <li>
        <input value="ABCD" class="origianl">
    </li>
</ul>

这是HTML行和

mainview = soup.find(class_="mainview")
child = mainview.children
child_value = child.get("value")
[print(x) for x in child_value]

这是我用来获得&#34; ABCD&#34;

的代码

并且我总是得到错误

AttributeError: 'list_iterator' object has no attribute 'get'

我搜索了谷歌和stackoverflow查询,但任何一个为我工作... 如何从input元素中获取值?

1 个答案:

答案 0 :(得分:0)

children(类似于'list_iterator')表示许多项目,因此您获得的列表不是单个项目。它甚至可以列出一个项目或空列表,但它仍然是一个列表。您必须使用for循环对列表中的每个项目使用get()或使用索引[0]仅获取第一个项目(如果列表不为空)

但在BeautifulSoup中,它不仅包含tags(类Tag)内的所有元素,还在标记(类text)之间提供NavigableString #39; t .get()方法。

此代码

from bs4 import BeautifulSoup

html = '''
<ul class="mainview">
    <li>
        <input value="ABCD" class="origianl">
    </li>
</ul>
'''

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

mainview = soup.find(class_="mainview")

for child in mainview.children:
    print(type(child))

给出

<class 'bs4.element.NavigableString'>
<class 'bs4.element.Tag'>
<class 'bs4.element.NavigableString'>

最好使用下一个find()查找单个元素或find_all()来获取元素列表。

from bs4 import BeautifulSoup

html = '''
<ul class="mainview">
    <li>
        <input value="ABCD" class="origianl">
    </li>
</ul>
'''

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

mainview = soup.find(class_="mainview")

child = mainview.find(class_="origianl")

print(child.get('value'))

修改

children仅提供第一级子项(<li>),但不包含子项(<input>)中的子项,因此您必须使用内部for循环来获取<input>

中的<li>
from bs4 import BeautifulSoup
import bs4

html = '''
<ul class="mainview">
    <li>
        <input value="ABCD" class="origianl">
    </li>
</ul>
'''

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

mainview = soup.find(class_="mainview")

print('--- children ---')
for child in mainview.children:
    print('>    tag:', child.name)
    print('>   type:', type(child))
    #print('>content:', child)
    if isinstance(child, bs4.element.Tag):
        print('>  value:', child.get('value'))
        print('          --- subchildren ---')
        for subchild in child.children:
            print('          >    tag:', subchild.name)
            print('          >   type:', type(subchild))
            #print('          >content:', subchild)
            if isinstance(subchild, bs4.element.Tag):
                print('          >  value:', subchild.get('value'))
            print('          -----------')

    print('-----------')

结果:

--- children ---
>    tag: None
>   type: <class 'bs4.element.NavigableString'>
-----------
>    tag: li
>   type: <class 'bs4.element.Tag'>
>  value: None
          --- subchildren ---
          >    tag: None
          >   type: <class 'bs4.element.NavigableString'>
          -----------
          >    tag: input
          >   type: <class 'bs4.element.Tag'>
          >  value: ABCD
          -----------
          >    tag: None
          >   type: <class 'bs4.element.NavigableString'>
          -----------
-----------
>    tag: None
>   type: <class 'bs4.element.NavigableString'>
-----------