如何使用beautifulsoup快速操作div内的span
Posted
技术标签:
【中文标题】如何使用beautifulsoup快速操作div内的span【英文标题】:How to manipulate span inside div quickly using beautifulsoup 【发布时间】:2019-02-09 02:24:16 【问题描述】:我有 HOCR 工具的 HTML 输出,我想对 div
类 ocr_carea
应用以下操作。
编辑的输入 html
HTML
文件中的div
标记如下所示。
<div class='ocr_carea' id='block_1_8' title="bbox 95 779 341 884">
<p class='ocr_par' id='par_1_16' lang='Latin' title="bbox 95 779 341 884">
<span class='ocr_line' id='line_1_29' title="bbox 96 779 338 800; baseline 0 -1; x_size 25.636646; x_descenders 5.6366458; x_ascenders 5">
<span class='ocrx_word' id='word_1_62' title='bbox 96 779 186 800; x_wconf 96'>Header</span>
<span class='ocrx_word' id='word_1_63' title='bbox 195 779 338 799; x_wconf 96'>Information</span>
</span>
<span class='ocr_line' id='line_1_30' title="bbox 96 819 341 839; baseline 0 0; x_size 25.26087; x_descenders 5.2608695; x_ascenders 6">
<span class='ocrx_word' id='word_1_64' title='bbox 96 819 212 839; x_wconf 96'>Purchase</span>
<span class='ocrx_word' id='word_1_65' title='bbox 221 819 290 839; x_wconf 96'>Order</span>
<span class='ocrx_word' id='word_1_66' title='bbox 300 819 341 839; x_wconf 96'>No:</span>
</span>
<span class='ocr_line' id='line_1_31' title="bbox 95 859 334 884; baseline -0.004 -4; x_size 26; x_descenders 5; x_ascenders 7">
<span class='ocrx_word' id='word_1_67' title='bbox 95 859 175 880; x_wconf 96'>Terms</span>
<span class='ocrx_word' id='word_1_68' title='bbox 185 859 210 880; x_wconf 96'>of</span>
<span class='ocrx_word' id='word_1_69' title='bbox 218 859 334 884; x_wconf 96'>Payment:</span>
</span>
</p>
</div>
<div class='ocr_carea' id='block_1_9' title="bbox 371 819 542 840">
<p class='ocr_par' id='par_1_17' lang='Latin' title="bbox 371 819 542 840">
<span class='ocr_line' id='line_1_32' title="bbox 371 819 542 840; baseline 0.006 -1; x_size 27.5; x_descenders 6.875; x_ascenders 6.875">
<span class='ocrx_word' id='word_1_70' title='bbox 371 819 542 840; x_wconf 96'>4056111455</span>
</span>
我想像这样连接它们并正确排序它们
<div class='ocr_carea' id='block_1_8' title="bbox 95 779 341 884">
<p class='ocr_par' id='par_1_16' lang='Latin' title="bbox 95 779 341 884">
<span class='ocr_line' id='line_1_29' title="bbox 96 779 338 800; baseline 0 -1; x_size 25.636646; x_descenders 5.6366458; x_ascenders 5">
<span class='ocrx_word' id='word_1_62' title='bbox 96 779 186 800; x_wconf 96'>Header</span>
<span class='ocrx_word' id='word_1_63' title='bbox 195 779 338 799; x_wconf 96'>Information</span>
</span>
<span class='ocr_line' id='line_1_30' title="bbox 96 819 341 839; baseline 0 0; x_size 25.26087; x_descenders 5.2608695; x_ascenders 6">
<span class='ocrx_word' id='word_1_64' title='bbox 96 819 212 839; x_wconf 96'>Purchase</span>
<span class='ocrx_word' id='word_1_65' title='bbox 221 819 290 839; x_wconf 96'>Order</span>
<span class='ocrx_word' id='word_1_66' title='bbox 300 819 341 839; x_wconf 96'>No:</span>
<span class='ocrx_word' id='word_1_70' title='bbox 371 819 542 840; x_wconf 96'>4056111455</span>
</span>
</span>
<span class='ocr_line' id='line_1_31' title="bbox 95 859 334 884; baseline -0.004 -4; x_size 26; x_descenders 5; x_ascenders 7">
<span class='ocrx_word' id='word_1_67' title='bbox 95 859 175 880; x_wconf 96'>Terms</span>
<span class='ocrx_word' id='word_1_68' title='bbox 185 859 210 880; x_wconf 96'>of</span>
<span class='ocrx_word' id='word_1_69' title='bbox 218 859 334 884; x_wconf 96'>Payment:</span>
</span>
</p>
</div>
我认为这可以通过BautifulSoup
来完成,到目前为止我已经实现的是在列表中添加span ocr_line
,我想在span ocr_line
中搜索并检查bbox是否靠近每个other 在 x 轴或 y 轴上或下移一个点
from bs4 import BeautifulSoup
soup = BeautifulSoup(hocr_container,'html.parser')
lines = soup.find_all('span',class_='ocr_line')
for line in lines
# Check the bbox and concatenate span
【问题讨论】:
AFAIK 获取元素的最快方法是通过它的 ID 选择器。您可以为所需的 ID 编写一个正则表达式,并通过该正则表达式获取所有 ocrx_words 和 ocrx_line 元素,然后解析它们。可以在这里找到解决方案:***.com/questions/2830530/… 我已经检查过了,但我的问题不是解析它们,而是合并跨度。 是否正在讨论使用您找到并处理的 BS 元素重新构建页面?如果是这样,您可以使用 BS 的元素的字符串表示形式。只需调用 str(whatever_element_you_found) 并将其结果附加到您在解析和排序时生成的文件中。示例在这里***.com/questions/25729589/… 和文档在这里crummy.com/software/BeautifulSoup/bs4/doc/#non-pretty-printing 所以,我们没有查找和替换方法或转移技术 【参考方案1】:这可能对你有帮助
from bs4 import BeautifulSoup
html = """
<div class='ocr_carea' id='block_1_8' title="bbox 95 779 341 884">
<p class='ocr_par' id='par_1_16' lang='Latin' title="bbox 95 779 341 884">
<span class='ocr_line' id='line_1_29' title="bbox 96 779 338 800; baseline 0 -1; x_size 25.636646; x_descenders 5.6366458; x_ascenders 5">
<span class='ocrx_word' id='word_1_62' title='bbox 96 779 186 800; x_wconf 96'>Header</span>
<span class='ocrx_word' id='word_1_63' title='bbox 195 779 338 799; x_wconf 96'>Information</span>
</span>
<span class='ocr_line' id='line_1_30' title="bbox 96 819 341 839; baseline 0 0; x_size 25.26087; x_descenders 5.2608695; x_ascenders 6">
<span class='ocrx_word' id='word_1_64' title='bbox 96 819 212 839; x_wconf 96'>Purchase</span>
<span class='ocrx_word' id='word_1_65' title='bbox 221 819 290 839; x_wconf 96'>Order</span>
<span class='ocrx_word' id='word_1_66' title='bbox 300 819 341 839; x_wconf 96'>No:</span>
<span class='ocrx_word' id='word_1_70' title='bbox 371 819 542 840; x_wconf 96'>4056111455</span>
</span>
</span>
<span class='ocr_line' id='line_1_31' title="bbox 95 859 334 884; baseline -0.004 -4; x_size 26; x_descenders 5; x_ascenders 7">
<span class='ocrx_word' id='word_1_67' title='bbox 95 859 175 880; x_wconf 96'>Terms</span>
<span class='ocrx_word' id='word_1_68' title='bbox 185 859 210 880; x_wconf 96'>of</span>
<span class='ocrx_word' id='word_1_69' title='bbox 218 859 334 884; x_wconf 96'>Payment:</span>
</span>
</p>
</div>"""
soup = BeautifulSoup(html, 'html.parser')
tag = soup.find_all('span', attrs='class':'ocr_line')
for i in tag:
x = (' '.join(i.stripped_strings))
print x
【讨论】:
很抱歉输入的 HTML 添加错误。我现在更正了。这个想法是我有两个跨度,我想根据条件合并它们以上是关于如何使用beautifulsoup快速操作div内的span的主要内容,如果未能解决你的问题,请参考以下文章
使用 BeautifulSoup 按 id 获取 div 的内容
如何使用 BeautifulSoup 在标签内获取 html 文本