1

我正在寻找一个漂亮的汤命令组合,以正确的顺序从 a-tag 字符串中提取“字符串”。

来源 1: <a href="target" title="title">a-string <img alt="img-alt"> <span>span-string</span></a>

目标 1:“a-string img-alt span-string”

来源 2: <a href="target" title="title"><span>span</span> string <img alt="alt"></a>

目标 2:“span-string a-string img-alt”

很容易通过“find_all()”获取子元素,通过“get_text()”获取文本。

如何获得不同“字符串”的正确顺序?还是按顺序解析a-string中的所有信息?

4

3 回答 3

0

对于 1:

import bs4
a = bs4.BeautifulSoup("""<a href="target" title="title">a-string <img alt="img-alt"> <span>span-string</span></a>""")
print(" ".join((a.find(text=True),a.find("img").attrs["alt"],a.find("span").text)))

对于 2:

import bs4
a = bs4.BeautifulSoup("""<a href="target" title="title">a-string <img alt="img-alt"> <span>span-string</span></a>""")
print(" ".join((a.find("span").text, a.find(text=True), a.find("img").attrs["alt"])))

我认为没有一种通用的方法可以提取您想要的内容,因为您正在混合文本内容和属性。

a.find(text=True) ## Get first element text
a.findAll(text=True) ## Get a list of text elements from string
于 2013-05-31T14:01:03.743 回答
0

使用lxml

import lxml.html as LH
content = '''
<a href="target" title="title">a-string <img alt="img-alt"> <span>span-string</span></a>
<a href="target" title="title"><span>span</span> string <img alt="alt"></a>
'''

root = LH.fromstring(content)
for atag in root.xpath('//a'):
    print(' '.join(atag.xpath('''
        descendant-or-self::text()
        |
        descendant-or-self::*/@alt
        ''')))

产量

a-string  img-alt span-string
span  string  alt
于 2013-05-31T19:03:25.647 回答
0

认为这是您正在寻找的答案...该contents方法返回一个列表

from BeautifulSoup import BeautifulSoup

s="""<a href="target" title="title">a-string <img alt="img-alt"> <span>span-string</span></a>"""
soup=BeautifulSoup(s)
z=soup.find("a")
print z.contents
于 2013-05-31T14:02:10.233 回答