3

我有一个简单的 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()函数的正确语法?

4

2 回答 2

1

你可以这样解析line

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 格式的参数:如果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 位置参数(for nameattrsrecursivetext),而不仅仅是name.

于 2012-11-24T03:11:09.747 回答
0

假设用户将这些参数提供给脚本,您将使用 sys.argv 获取它们,然后将它们与您的代码一起使用

#foo.py
import sys

for arg in sys.argv:
    print arg

hvn@hvnatvcc: ~/test $ python foo.py http://xyz.com div doctext
foo.py
http://xyz.com
div
doctext

您的代码将如下所示

html = urllib2.urlopen(sys.argv[1]).read()
soup = BeautifulSoup(html)
html_section = str(soup.find(sys.argv[2], id=sys.argv[3]))

您的代码有什么问题: find()不会将id字符串id="doctext"视为功能的关键。Python 将'id="doctext"'其视为一个完整的字符串。

于 2012-11-24T03:44:53.050 回答