python - 在 python BeautifulSoup4 中,将字符串转换为 find() 的参数

标签 python beautifulsoup

我有一个简单的 Python 脚本,它使用 BeautifulSoup 来查找 HTML 树的一部分。例如,要查找 <div id="doctext"> 中的所有内容标记,脚本执行此操作:

html_section = str(soup.find("div", id="doctext"))

我希望能够为 find() 提出论据但是,根据输入文件中给出的字符串而有所不同。例如,用户可以向脚本提供一个 URL 后跟一个类似 "div", id="doctext" 的字符串。 ,脚本会相应地调整查找。假设输入文件如下所示:

http://www.example.com | "div", id="doctext"

脚本拆分行以获取 URL,这工作正常,但我希望它也获取参数。例如:

vars = line.split(' | ')
html = urllib2.urlopen(vars[0]).read()
soup = BeautifulSoup(html)
args = vars[1].split()
html_section = str(soup.find(*args))

这行不通——而且可能没有意义,因为我一直在尝试多种方法来做到这一点。如何获取输入文件提供的字符串并将其准备为 soup.find() 的正确语法功能?

最佳答案

你可以这样解析:

line = 'http://www.example.com | div, id=doctext'
url, args = line.split(' | ', 1)
args = args.split(',')
name = args[0]
params = dict([param.strip().split('=') for param in args[1:]])
print(name)
print(params)

产量

div
{'id': 'doctext'}

然后你可以这样调用soup.find:

html = urllib2.urlopen(url).read()
soup = BeautifulSoup(html)
html_section = str(soup.find(name, **params))

警告:请注意,如果 doctext(或其他一些关键字参数)包含逗号,则

args = args.split(',')

会将参数分割在错误的地方。如果您正在搜索某些包含逗号的 text 内容,则可能会出现此问题。


所以让我们寻找一个更好的解决方案:

为避免上述问题,您可以考虑使用 JSON format对于参数:如果 line 看起来像这样:

'http://www.example.com | ["div", {"id": "doctext"}]'

然后你可以解析它

import json
line = 'http://www.example.com | ["div", {"id": "doctext"}]'
url, arguments = line.split('|', 1)
url = url.strip()
arguments = json.loads(arguments)
args = []
params = {}
for item in arguments:
    if isinstance(item, dict):
        params = item
    else:
        args.append(item)

print(args)
print(params)

产生

[u'div']
{u'id': u'doctext'}

然后你可以用

调用soup.find
html_section = str(soup.find(*args, **params))

另一个优势是您可以提供任意数量的 soup.find's positional arguments (对于 nameattrsrecursivetext),而不仅仅是 name.

关于python - 在 python BeautifulSoup4 中,将字符串转换为 find() 的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13537829/

相关文章:

python - 用beautifulsoup提取br标签之间的数据

html - 如何删除 beautifulsoup 中特定模式内的任何 html 标签

python - 如何使用 beautifulsoup 为 html 嵌套标签定义 findAll

python - 从 Pandas 数据框中删除字典引用

python - 如何从 Python 请求中提取值

python - 上下文 `Order.Items` 未出现在 Django Admin 的 PDF 文件中

python - pytorch DataLoader 第一个时代非常慢

python - 在同一台机器 (OS X) 的 Python 2 和 Python 3 上安装 Beautiful Soup

python - 网页抓取 - 进入第 2 页

python : Help for an elegant list comprehension for an awkward format