我有一个简单的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()
函数的正确语法?
答案 0 :(得分: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 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(name
,attrs
,recursive
和text
),而不只是name
。
答案 1 :(得分:0)
假设用户将脚本提供给那些args,你会得到它们 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"'
视为整个字符串。