Python3-BeautifulSoup-获取两个标记之间的值,其中值介于
我有以下HTML块,它们是由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
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
中,我们检查的值应该是2xxmin
吗?不是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)