Python3-BeautifulSoup-获取两个标记之间的值,其中值介于

Python3-BeautifulSoup-获取两个标记之间的值,其中值介于,python,python-3.x,beautifulsoup,Python,Python 3.x,Beautifulsoup,我有以下HTML块,它们是由pdftotext使用-bbox布局选项生成的: <flow> <block xMin="21.600000" yMin="86.356000" xMax="178.647000" yMax="116.233001"> <line xMin="21.600000" yMin="86.356000" xMax="178.647000" yMax="101.833000"> <word xMin="21.6

我有以下HTML块,它们是由
pdftotext
使用
-bbox布局
选项生成的:

<flow>
<block xMin="21.600000" yMin="86.356000" xMax="178.647000" yMax="116.233001">
    <line xMin="21.600000" yMin="86.356000" xMax="178.647000" yMax="101.833000">
        <word xMin="21.600000" yMin="86.356000" xMax="178.647000" yMax="101.833000">
            My text string located here!</word>
    </line>

</block>
</flow>

[...]
<flow>
<block xMin="223.560000" yMin="323.675000" xMax="345.563500" yMax="339.855500">
    <line xMin="223.560000" yMin="323.675000" xMax="345.563500" yMax="339.855500">
        <word xMin="223.560000" yMin="323.675000" xMax="316.836500" yMax="339.855500">Another string
        </word>
        <word xMin="320.022000" yMin="323.675000" xMax="345.563500" yMax="339.855500">And another!</word>
    </line>
</block>
</flow>
上面的代码没有返回任何内容,因为没有匹配的标记。
find_all()
搜索具有特定数字的
block
标记的精确匹配-但我正在尝试搜索
block
标记,其中xMin和xMax为:

areas[0] is between 100 and 200

areas[1] is between 200 and 612
这在BeautifulSoup中可能吗?

试试看

parsed_html.select("block")
并使用键“xMin”和“xMax”过滤结果

例如,如果要获取
,可以首先通过以下方式获取所有
标记:

all_blocks = parsed_html.select("block")
如果要得到
中的一个,其
xMin
为1,
xMax
为2,则可以将其设置为:

target = filter(lambda x: x["xMin"] == "1" and x["xMax"] == 2, all_blocks)
您可以使用属性
xMin
选择
,使用CSS选择器
block[xMin][xMax]
选择
xMax
。然后通过列表理解进行筛选:

data = '''<flow>
<block xMin="21.600000" yMin="86.356000" xMax="178.647000" yMax="116.233001">
    <line xMin="21.600000" yMin="86.356000" xMax="178.647000" yMax="101.833000">
        <word xMin="21.600000" yMin="86.356000" xMax="178.647000" yMax="101.833000">
            My text string located here!</word>
    </line>

</block>
</flow>

<flow>
<block xMin="223.560000" yMin="323.675000" xMax="345.563500" yMax="339.855500">
    <line xMin="223.560000" yMin="323.675000" xMax="345.563500" yMax="339.855500">
        <word xMin="223.560000" yMin="323.675000" xMax="316.836500" yMax="339.855500">Another string
        </word>
        <word xMin="320.022000" yMin="323.675000" xMax="345.563500" yMax="339.855500">And another!</word>
    </line>
</block>
</flow>'''

from bs4 import BeautifulSoup

soup = BeautifulSoup(data, 'lxml')

def blocks_min_max(soup, x_min, x_max):
    return [b for b in soup.select('block[xMin][xMax]') if float(b['xmin']) >= x_min and float(b['xmax']) <= x_max]

for b in blocks_min_max(soup, 10, 200):
    print(b.prettify())
data=''
我的文本字符串位于这里!
另一串
还有一个!
'''
从bs4导入BeautifulSoup
soup=BeautifulSoup(数据'lxml')
def块最小值最大值(汤,最小值x最大值x最大值):
返回[b代表汤中的b。如果float(b['xMin']>=x_min,则选择('block[xMin][xMax]),然后用float(b['xMax'])替换代码:

block_tags = parsed_html.find_all(
            "block", attrs={"xMin": xMinValue, "xMax": xMaxValue})
print(block_tags)
致:

block_tags=parsed_html.find_all(“block”)
对于块中的块标记:

如果浮点(块['xmin'])>=xMinValue和浮点(块['xmax'])您介意提供更多的信息吗?这如何解决我当前的问题,我需要在
xMin
xMax
位于一组数字之间的位置获取标记?谢谢Andrej!但是,这给了我以下错误:
不受支持或无效的CSS选择器:“block[xMin][xMax”
@oliverbj您使用的是什么版本的BeautifulSoup?我在
if float(…
语句中的
beautifulsoup4==4.7.1
中,我们检查的值应该是2x
xmin
吗?不是
xMax
block_tags = parsed_html.find_all(
            "block", attrs={"xMin": xMinValue, "xMax": xMaxValue})
print(block_tags)
block_tags = parsed_html.find_all("block")

for block in block_tags:
    if float(block['xmin']) >= xMinValue and  float(block['xmax']) <= xMinValue:
        print(block)