0

我试图找到位于通过 H1 标签的图像。标记可以是在线杂志上的任何文章(示例)。这意味着我不能依赖特定的容器等。

我最初的想法是找到H1标签的字符位置并找到图像。这将让我确定他们相对于 H1 标签的位置。除非我遗漏了一些东西,否则我找不到用美丽的汤来获取已找到元素的字符位置的方法。

无论必须使用什么方法来解析 html,它都必须使用格式错误的语法。

例子:

<html>
    <p>some text</p>
    <img src="#" alt="I don't care about this image"/>
    <h1>This is the title</h1>
    <img src="#" alt="This is the first image I want to get"/>
    <p>some more content</p>
    <img src="#" alt="This is the secod image I want to get"/>
</html>

解析以上 html 将返回一个列表,其中包含位于 H1 标记下方的 2 个图像。

更新:我完全重写了我的问题以更好地解释问题。

4

2 回答 2

1

回答我自己的问题。在 H1 标记之后获取所有图像的解决方案是:

soup = BeautifulSoup(html_contents, 'html5lib') # parse html markup
soup_h1 = soup.find('h1') # find H1 tag
soup_imgs = soup_h1.find_all_next('img') # returns a list of img objects

感谢大家的帮助。

于 2013-06-11T03:41:29.510 回答
0

lxml可能很适合这个。这将获取所有 img 标签,但仅打印前面带有 h1 标签的标签。它也按照它们出现在 DOM 中的顺序进行。

from lxml import etree
from StringIO import StringIO

html = """
<body>
<h1>a</h1>
<img src="afterh1-1"/>
<h2>b</h2>
<img src="afterh2"/>
<h1>a</h1>
<img src="afterh1-2"/>
</body>
"""

f = StringIO(html)
tree = etree.parse(f)

for i in tree.xpath('//img'):
    if i.getprevious().tag.lower() == "h1":
        print "Match: %s - %s" % (i.get('src'), i.getprevious().tag)

输出:

Match: afterh1-1 - h1
Match: afterh1-2 - h1

这是产生相同输出的 beautifulsoup 版本

from bs4 import BeautifulSoup

html = """
<body>
<h1>a</h1>
<img src="afterh1-1"/>
<h2>b</h2>
<img src="afterh2"/>
<h1>a</h1>
<img src="afterh1-2"/>
</body>
"""

soup = BeautifulSoup(html)

for i in soup.find_all('img'):
    if i.previous_sibling.previous_sibling.name == "h1":
        print "Match: %s - %s" % (i.get('src'), i.previous_sibling.previous_sibling.name)
于 2013-06-11T01:53:12.590 回答