繁体   English   中英

使用 Beautifulsoup 提取下一个和不同标签的内容

[英]Extracting content of next and different tag using Beautifulsoup

我想抓取一些特定的 html 代码。

我的蟒蛇代码:

    soup = '''

            <p>
                <strong> abc </strong>
            </p>

            <ul>
                <li> 123 </li>
                <li> 456 </li>
            </ul>
    '''

    import bs4
    soup = bs4.BeautifulSoup(soup, 'html.parser')
    for link in soup.find_all('strong') :
        k = link.next_sibling
        print (link.text)
        print (k)
        print (k.text)

和输出:

    abc

    AttributeError: 'NavigableString' object has no attribute 'text'

如何使用上述标签提取“123”和“456”?

谢谢 。

解决方法有很多,比如可以结合find_next()find_next_sibling()方法:

soup = '''

        <p>
            <strong> abc </strong>
        </p>

        <ul>
            <li> 123 </li>
            <li> 456 </li>
        </ul>
'''

import bs4
soup = bs4.BeautifulSoup(soup, 'html.parser')
for link in soup.find_all('strong') :
    li1 = link.find_next().li
    li2 = li1.find_next_sibling()
    print(link.text)
    print(li1.text)
    print(li2.text)

印刷:

 abc 
 123 
 456 

您需要123456因此您可以使用 :has 和:contains (bs4 4.7.1+) 来定位具有文本'abc'strong的父p ,然后使用带有类型选择器的相邻同级组合器来获取相邻的ul ; 最后使用带有li类型选择器的子组合器来获取子li元素。

from bs4 import BeautifulSoup as bs

html = '''

            <p>
                <strong> abc </strong>
            </p>

            <ul>
                <li> 123 </li>
                <li> 456 </li>
            </ul>
    '''

soup = bs(html, 'lxml')
print([i.text for i in soup.select('p:has(>strong:contains("abc")) + ul > li')])

在此处阅读有关 css 选择器的 信息

from simplified_scrapy.simplified_doc import SimplifiedDoc 
html = '''<div><p>
                <strong> abc </strong>
            </p>
            <ul>
                <li> 123 </li>
                <li> 456 </li>
            </ul></div>'''
doc = SimplifiedDoc(html)
s = doc.strong # doc.getElementByTag('strong')
lis = s.parent.next.children
print(s.text) 
print(lis[0].text) 
print(lis[1].text) 

结果:

abc
123
456

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM