BeautifulSoup 找到的内容, 属性为什么是倒过来的?

2020-02-20 20:21:42 +08:00
 l4ever
from bs4 import BeautifulSoup

content = """
    <text transform="matrix(1.0318 0 0 1 575.125 394.0762)" class="abc" style="a123">ABC</text>

    <text transform="matrix(1 0 0 1 531.0552 394.0762)" font-family="'MicrosoftYaHei'" font-size="18px">DEF</text>
    """
soap = BeautifulSoup(markup=content, features='lxml')
soap_text = soap.find_all('text')
for s in soap_text:
    print(s)


输出:

<text class="abc" style="a123" transform="matrix(1.0318 0 0 1 575.125 394.0762)">ABC</text>

<text font-family="'MicrosoftYaHei'" font-size="18px" transform="matrix(1 0 0 1 531.0552 394.0762)">DEF</text>

很是费解, 为什么输出的内容和原文不一样了呢, 有些属性调整了位置.

2866 次点击
所在节点    Python
10 条回复
l4ever
2020-02-20 20:22:45 +08:00
我是要读出来, 然后直接逐行进行修改后替换回去, 这样更改了位置. 没法替换回去啊.
freakxx
2020-02-20 21:37:41 +08:00
直接这样不行?
s.attrs[attr_name] = attr_value
l4ever
2020-02-20 22:13:19 +08:00
@freakxx 我要修改 text 值 ,好像修改不了。看了一下 sf 也有人问,貌似无解。只能拿到唯一值去 html 源代码搜,找到对应行读回来。🤣
jmc891205
2020-02-20 22:21:49 +08:00
html 标签的属性是无序的 不知道你要做什么 但不要依赖于 html 标签属性的顺序去写应用
learnshare
2020-02-20 22:27:07 +08:00
属性并没有强制顺序,应当解析并根据 元素 + 属性名 查找
Shazoo
2020-02-20 22:44:00 +08:00
soup.replae_with() + soup.prettify() ?
encro
2020-02-20 22:49:24 +08:00
这个,只能看源码吧。
如果没有记错的话,反转不是直接利用原来文档,是重新生成了,要原来文档有一个双下划线的属性。
l4ever
2020-02-20 22:53:39 +08:00
@encro 帮我看看是哪个属性啊?我现在是找出来之后,有回到 html 源代码读原文的 特别别扭。
encro
2020-02-20 23:03:59 +08:00
三个方法:
1,print(s)改为 dir(s)
2,直接用 ipython 看一下
3,直接用 ide 调试看
whoops
2020-02-20 23:42:47 +08:00
修改属性按二楼的方法,修改 text 修改 string

for s in soap_text:
s.string = 'Something'
print(s)

另外属性不是倒过来了,是按字母排序了,具体前面有人说了看源码__str__方法的实现

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/646203

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX